最近项目要求开发一个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<Object[]> 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<Object[]> test(){
List<Object[]> bides = (List<Object[]>) em.createNativeQuery("select * from d_Service s").getResultList();
return bides;
}
}
这个组件类就不多说了!
3. 接下来是seam环境中进行一些配置。
首先是在META-INFO中增加一个standard-jaxws-endpoint-config.xml文件,具体内容如下:
<jaxws-config xmlns="urn:jboss:jaxws-config:2.0"
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">
<endpoint-config>
<config-name>Seam WebService Endpoint</config-name>
<pre-handler-chains>
<javaee:handler-chain>
<javaee:protocol-bindings>##SOAP11_HTTP</javaee:protocol-bindings>
<javaee:handler>
<javaee:handler-name>SOAP Request Handler</javaee:handler-name>
<javaee:handler-class>org.jboss.seam.webservice.SOAPRequestHandler</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</pre-handler-chains>
</endpoint-config>
</jaxws-config>
其实是一个WS的SOAP请求处理器。
之后是web.xml中增加两个配置:
……
<servlet>
<servlet-name>TestService Servlet</servlet-name>
<servlet-class>com.test.service.TestService</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestService Servlet</servlet-name>
<url-pattern>/TestService</url-pattern>
</servlet-mapping>
……
以及:
……
<filter>
<filter-name>Seam Servlet Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Seam Servlet Filter</filter-name>
<url-pattern>/TestService</url-pattern>
</filter-mapping>
……
最后还要在component.xml中增加一个配置:
<web:context-filter url-pattern="/TestService/*"/>
ok ,至此所有配置都已完成。
可以看到一个结果如下:
那就证明WS服务发布成功了!
(二)Client测试
首先利用JDK6中wsimport工具生成client代码。
1. cmd
3. 将E:\wsclientest\generate 下的java文件拷贝到eclipse中新建的java project里。注意包名。
4. 相同包下,新建一个test类,如下代码:
public static void main(String[] args) {
TestServiceService tss = new TestServiceService();
TestService ts = tss.getTestServicePort();
List<AnyTypeArray> resultList= ts.testWebServ();
for (AnyTypeArray objectAA : resultList) {
List<Object> objectAAEach =objectAA.getItem();
System.out.println(objectAAEach.get(1));
}
}
5. run as application
6. 成功!
(三) 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自带的老版本,经验证有效。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。