|
作者:Administrator
|
|
2009-04-12 11:25 |
|
前文“折腾了一把 JAX-WS, SOA & Java EE 5(http://javaresearch.org/article/116761.htm)”简要地总结了jax-ws 2.0/2.1 及其在Glassfish v2 上的部署情况。最近又试着将该POJO web service打包成war部署到JBoss上(同样的war部署在Glassfish上运行良好)。下面是小结:
一,部署jax-ws 2.0/2.1 POJO Web Service到JBoss4.2.2.GA
1:必须为你的POJO Web Service定义一个Servlet,并定义service的endpoint。 这意味着必须修改/增加两个文件:WEB-INF/web.xml;WEB-INF/sun-jaxws.xml (附文后)
2:最好将所需的jax-ws jars放到WEN-INF/lib里,免得将这些jar拷贝来拷贝去。 本人曾试了半天,拷来拷去,反正是搞不定。最后还是一古脑儿索性全放到WEB-INF/lib里,倒是爽快:
WEB-INF/lib/jaxws-rt.jar WEB-INF/lib/jaxws-tools.jar WEB-INF/lib/log4j-1.2.8.jar WEB-INF/lib/saaj-api.jar WEB-INF/lib/saaj-impl.jar WEB-INF/lib/sjsxp.jar WEB-INF/lib/stax-ex.jar WEB-INF/lib/streambuffer.jar WEB-INF/lib/sxalan.jar
别问我到底哪个是哪个,都是干什么的。
二,部署jax-ws 2.0/2.1 POJO Web Service到JBoss5.0.0.GA
好像是去年,JBoss5面世了,根据其Release Note,它是“the final release of the JBoss 5.0 series for the Java EE™5 codebase that fully complies with the Java EE 5 conformance testing certification requirements.”但本人的试验结果却是大失所望:如果将我们的web service打包成war部署到JBoss 5.0上,根本就不工作,问题多去了。为什么同样的war部署在Glassfish上就运行良好呢?果真是“fully complies with the Java EE 5 ”?看起来并不那么“fully”。
JBoss5.0.0.GA的server classloader搜寻路径发生了一点变化。根据其Release Note的“指示”:“When running under Java 6 you need to manually copy the following libraries from the JBOSS_HOME/client directory to the JBOSS_HOME/lib/endorsed directory, so that the JAX-WS 2.0 apis supported by JBossWS are used:
jbossws-native-saaj.jar jbossws-native-jaxrpc.jar jbossws-native-jaxws.jar jbossws-native-jaxws-ext.jar ”
这个也无济于事。
最终,还得像部署在JBoss4.2.2.GA上一样进行部署。
总结: 1:将jax-ws 2.0/2.1 POJO web service部署得到JBoss4.2/5.0是一样费劲的。 2:基本上需要两步:一是要定义WEB-INF/web.xml 和 WEB-INF/sun-jaxws.xml;二是要将所需的相关的 ws libs 放到war的本地classpath上。 3:还发现一个怪现象:@WebService attribute 是否附值与附哪些值,JBoss与 Glassfish所由此产生的wsdl内容很不相同。这有点儿头痛。
Why JBoss then? 答案是我儿子的口头禅:“我也不知道!”。
附上相关文件:
{code} ----------------------- service interface: VodOptService ------------------
package com.vodws.service.opt;
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import com.vodws.service.GetPersonRequest; import com.vodws.service.GetPersonResponse;
@WebService @SOAPBinding( style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.BARE ) public interface VodOptService { @WebMethod @WebResult( name="getPersonResponse", targetNamespace="http://www.vodws.com/service", partName="getPersonResponse" ) public GetPersonResponse getPerson( @WebParam(name="getPersonRequest", targetNamespace="http://www.vodws.com/service", partName="getPersonRequest" ) GetPersonRequest request); }
--------------------- service implementation: VodOptServiceImp -----------------
package com.vodws.service.opt;
import java.util.ArrayList; import javax.jws.WebService; import org.apache.log4j.Logger; import com.vodws.service.GetPersonRequest; import com.vodws.service.GetPersonResponse; import com.vodws.service.Person; import com.vodws.service.ServiceResponse.ServiceMessage;
@WebService(serviceName="optsvs", endpointInterface="com.vodws.service.opt.VodOptService") public class VodOptServiceImp implements VodOptService { private static final Logger log = Logger.getLogger(VodOptServiceImp.class); private static final String MSISDN = "6421123456"; public GetPersonResponse getPerson(GetPersonRequest request) { GetPersonResponse response = new GetPersonResponse(); if(request == null) { log.error("john, service request is null"); ServiceMessage.Message msg = new ServiceMessage.Message(); msg.setContent("Sorry, request is null"); msg.setLevel("ERROR"); ArrayList<ServiceMessage.Message> msglist = new ArrayList<ServiceMessage.Message>(); msglist.add(msg);
ServiceMessage error = new ServiceMessage(); error.getMessages().addAll(msglist); response.setServiceMessage(error); return response; } String msisdn = request.getMsisdn(); log.debug("Getting person for msisdn: " + msisdn); Person person = new Person(); person.setFirstName("jason"); person.setLastName("wang"); person.setMsisdn(MSISDN); response.setPerson(person); return response; } }
-------------------- WEB-INF/web.xml ---------------------- <?xml version="1.0" encoding="UTF-8"?> <!-- servlet 2.5, jsp 2.1 --> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>vodws</display-name> <description>vodws</description> <!-- jwang, 2009-03-24: necessary if deploying to JBoss 4.2.x, not required for Glassfish 2 --> <listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener </listener-class> </listener> <servlet> <description>vod opt web service</description> <display-name>vod opt web service</display-name> <servlet-name>VodOptService</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>VodOptService</servlet-name> <url-pattern>/optsvs</url-pattern> </servlet-mapping>
<!-- othe web.xml content...-->
</web-app>
-------------------- WEB-INF/sun-jaxws.xml ------------------- <?xml version="1.0" encoding="UTF-8"?>
<!-- jwang 2009-03-24: this file is required if deploying to JBoss-4.2.x. not required for Glassfish 2 --> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="VodOptService" implementation="com.vodws.service.opt.VodOptServiceImp" service="{http://www.vodws.com/service}VodOptService" port="{http://www.vodws.com/service}VodOptService" url-pattern="/optsvs" /> </endpoints> {code}
|
|
最后更新于: 2009-04-12 11:25 |