JAVA认证:JBoss4.2及JBoss5.0部署jax-ws2.0/2.1WebServices
来源:优易学  2011-4-30 10:00:19   【优易学:中国教育考试门户网】   资料下载   IT书店
  最近试着将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}

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训