最近试着将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}
责任编辑:小草