跌宕多姿,:SEAM中集成使用WebService的整体流程

来源:百度文库 编辑:九乡新闻网 时间:2024/05/01 17:45:02
最近项目要求开发一个WebService接口给用户。之前从未接触过WS,于是上网查、seam群里请教大虾,今日终于修成正果。现将详尽步骤总结如下:总的来说,WS编程分为两部分:WS接口端和模拟客户端。难度并不是WS技术本身,而是你的开发环境和WS如何进行结合。先说下我的WEB环境是SEAM。WEB APP 服务器是Jboss423GA。如何在SEAM中集成使用WS,是我首先输入google的key word。下面真正的开始我的步骤,看好了!(一)服务端接口的开发1.   WebService 类:@WebService
public class TestService {
 @WebMethod
    public List testWebServ(){ 
        TestSeamComp comp = (TestSeamComp) Component.getInstance(TestSeamComp.class,true); 
        return comp.test(); 
    } 
} 注意:其中使用了关键的WS的注解:@WebService 和  @WebMethod然后调用了一个seam组件:TestSeamComp。这样的好处是什么?SEAM相关的文档说的好啊:“WS只是将SEAM组件进行了包装,具体的业务是在SEAM组件中进行的”。如2所示代码: 2.   被调用的Seam组件TestSeamComp:@Name("testSeamComp") 
@AutoCreate
public class TestSeamComp {
 @In("entityManager")
 private EntityManager em;
 public List test(){
        List bides = (List) em.createNativeQuery("select * from d_Service s").getResultList();
        return bides;
    } 
}这个组件类就不多说了! 3.   接下来是seam环境中进行一些配置。首先是在META-INFO中增加一个standard-jaxws-endpoint-config.xml文件,具体内容如下:      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:javaee="http://java.sun.com/xml/ns/javaee"
      xsi:schemaLocation="urn:jboss:jaxws-config:2.0 jaxws-config_2.1.xsd">
  
      Seam WebService Endpoint
     
        
            ##SOAP11_HTTP
           
               SOAP Request Handler
               org.jboss.seam.webservice.SOAPRequestHandler
           

        

     

  

其实是一个WS的SOAP请求处理器。之后是web.xml中增加两个配置:……   
   TestService Servlet 
   com.test.service.TestService 
   1 
 
 
  
   
     TestService Servlet 
     /TestService 
 
  ……以及:……     
          Seam Servlet Filter
          org.jboss.seam.servlet.SeamServletFilter
     

  
     
          Seam Servlet Filter
          /TestService
     
…… 最后还要在component.xml中增加一个配置:ok ,至此所有配置都已完成。4.   启动Jboss app server,浏览器中输入:http://localhost:8080/myproject/TestService?wsdl可以看到一个结果如下:那就证明WS服务发布成功了! (二)Client测试首先利用JDK6中wsimport工具生成client代码。1.   cmd2.   E:\wsclientest>wsimport -s generate http://localhost:8080/stat/TestService?wsdl3.   将E:\wsclientest\generate 下的java文件拷贝到eclipse中新建的java project里。注意包名。4.   相同包下,新建一个test类,如下代码: public static void main(String[] args) {
  TestServiceService tss = new TestServiceService();
     TestService ts = tss.getTestServicePort();
     List  resultList= ts.testWebServ();
     for (AnyTypeArray objectAA : resultList) {
      List objectAAEach  =objectAA.getItem();
      System.out.println(objectAAEach.get(1));
     }
 } 5.   run as application6.   成功! (三) ok了!(四) 测试过程中遇到的问题集锦: 1. 从client application 中测试调用服务端接口报错如下:      java.lang.UnsupportedOperationException: “setProperty must be overridden by all subclasses of SOAPMessage”      原因:Jboss的soap实现的是老的javax.xml.soap.SoapMessage接口,这个接口的setProperty方法在老版本是不需要override的,但是到了Java6,
               由于Java6的jdk本身自带soap包,而自带的这个包的SoapMessage接口对setProperty方法又强制其实现类要override自身,否则则抛出上述异常。      问题解决方式:把${JBOSS_HOME}/lib/中除了getopt.jar, jboss-system.jar, jboss-jmx.jar其他所有的jar拷贝进${JBOSS_HOME}/lib/endorsed,同时拷贝${JBOSS_HOME}/client/目录中的jboss-saaj.jar ,jboss-jaxrpc.jar到${JBOSS_HOME}/lib/endorsed目录下,这样服务器将使用jboss自带的老版本,经验证有效。