我们先来了解一下WebService吧:
新建一个WebService的工程,并把JBoss下client中的包全部引入进去,然后创建一个JavaBean、Service接口和Service实现类,如下:
package com.zlb.bean; import java.io.Serializable; public class Order implements Serializable{ /** * */ private static final long serialVersionUID = -6775239525080104316L; private String orderid; private String name; public String getOrderid() { return orderid; } public void setOrderid(String orderid) { this.orderid = orderid; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.zlb.service; import java.util.List; import com.zlb.bean.Order; public interface OrderService { public String getUserName(String name); public Order getOrder(String orderid); public List<Order> getOrders(); }
package com.zlb.service.impl; import java.util.ArrayList; import java.util.List; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.jws.WebService; import com.zlb.bean.Order; import com.zlb.service.OrderService; //修改命名空间的名称、接口的名称以及服务的名称 @WebService(targetNamespace="http://ws.zlb.com", name="OrderService", serviceName="OrderServiceBean") @Stateless @Remote(OrderService.class) public class OrderServiceBean implements OrderService { public String getUserName(String name) { return name; } public Order getOrder(String orderid) { Order order = new Order(); order.setOrderid(orderid); order.setName("小明"); return order; } public List<Order> getOrders() { List<Order> persons = new ArrayList<Order>(); Order order1 = new Order(); order1.setOrderid("1"); order1.setName("小丽"); Order order2 = new Order(); order2.setOrderid("2"); order2.setName("小琴"); persons.add(order1); persons.add(order2); return persons; } }
在实现类中,如果只是想暴露某个方法,则可以在方法上面加@WebMethod。如果想修改图三中的三个红框中的值可以按照实现类中@WebSerivce注解的格式写。
接着,可以通过ANT编译一下,有关代码请参考:http://blog.csdn.net/zlb824/article/details/7067113
编译完之后你可以在后台进行查看,输入URL:http://localhost:8080/jbossws/,如下:
接下来我们要开始编写客户端代码啦,先来张图片了解一下吧:
因此,我们可以通过ANT来生成客户端辅助类,相关代码如下:
<?xml version="1.0" encoding="UTF-8"?> <project name="webServiceClient" default="zlb" basedir="."> <property name="src.dir" value="${basedir}/src"/> <path id="build.classpath" description="设置类路径"> <fileset dir="${basedir}/lib"> <include name="*.jar"/> </fileset> </path> <target name="zlb" description="生成webservice客户端辅助代码,执行后请刷新项目"> <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport" classpathref="build.classpath"/> <wsimport wsdl="http://127.0.0.1:8080/webService/OrderServiceBean?wsdl" sourcedestdir="${src.dir}" package="com.zlb.client" keep="true" verbose="true" destdir="${basedir}/bin"/> <!-- keep的值代表是否更新旧值,varbose的值代表是否打印操作过程,destdir的值代表源文件编译过后存放的路径 --> </target> </project>
有这个配置中的工程名可以看出,我们要新建一个客户端工程,然后我们可以再新建一个JUnit测试类,如下:
package com.zlb.junit; import java.util.List; import org.junit.BeforeClass; import org.junit.Test; import com.zlb.client.Order; import com.zlb.client.OrderService; import com.zlb.client.OrderServiceBean; public class JunitWS { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void getUserName() { OrderServiceBean osb = new OrderServiceBean();//创建一个服务对象 OrderService orderService = osb.getOrderServicePort();//通过服务对象得到端点 System.out.println(orderService.getUserName("小明")); } @Test public void getOrder(){ OrderServiceBean osb = new OrderServiceBean();//创建一个服务对象 OrderService orderService = osb.getOrderServicePort();//通过服务对象得到端点 Order order = orderService.getOrder("111"); System.out.println(order.getOrderid()+","+order.getName()); } @Test public void getOrders(){ OrderServiceBean osb = new OrderServiceBean();//创建一个服务对象 OrderService orderService = osb.getOrderServicePort();//通过服务对象得到端点 List<Order> orders = orderService.getOrders(); for(Order order : orders) System.out.println(order.getOrderid()+","+order.getName()); } }
得出的结果分别如下:
小明
111,小明
1,小丽
2,小琴
大功告成啦!可是别高兴太早,先来看看我的环境吧:
JDK:1.5
JBoss:4.2.2
可是,如果你换成下面两种情况的话就会报错啦,我们先来测试
JDK:1.5
JBoss:5.X
的情况吧,通过JUnit单元测试打印的结果如下:
第一个为:null
之后两个就是报错,截取一段吧,如下:
java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage
at javax.xml.soap.SOAPMessage.setProperty(SOAPMessage.java:441)
at org.jboss.ws.core.soap.SOAPMessageImpl.<init>(SOAPMessageImpl.java:87)
at org.jboss.ws.core.soap.MessageFactoryImpl.createMessage(MessageFactoryImpl.java:215)
at org.jboss.ws.core.soap.MessageFactoryImpl.createMessage(MessageFactoryImpl.java:193)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.processRequest(RequestHandlerImpl.java:455)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleRequest(RequestHandlerImpl.java:295)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.doPost(RequestHandlerImpl.java:205)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:131)
at org.jboss.wsf.common.servlet.AbstractEndpointServlet.service(AbstractEndpointServlet.java:85)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
13:56:53,571 ERROR [RequestHandlerImpl] Error processing web service request
org.jboss.ws.WSException: java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage
at org.jboss.ws.WSException.rethrow(WSException.java:68)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleRequest(RequestHandlerImpl.java:336)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.doPost(RequestHandlerImpl.java:205)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:131)
at org.jboss.wsf.common.servlet.AbstractEndpointServlet.service(AbstractEndpointServlet.java:85)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage
at javax.xml.soap.SOAPMessage.setProperty(SOAPMessage.java:441)
at org.jboss.ws.core.soap.SOAPMessageImpl.<init>(SOAPMessageImpl.java:87)
at org.jboss.ws.core.soap.MessageFactoryImpl.createMessage(MessageFactoryImpl.java:169)
at org.jboss.ws.core.jaxws.SOAPFaultHelperJAXWS.createSOAPMessage(SOAPFaultHelperJAXWS.java:295)
at org.jboss.ws.core.jaxws.SOAPFaultHelperJAXWS.toSOAPMessage(SOAPFaultHelperJAXWS.java:256)
at org.jboss.ws.core.jaxws.SOAPFaultHelperJAXWS.exceptionToFaultMessage(SOAPFaultHelperJAXWS.java:187)
at org.jboss.ws.core.jaxws.binding.SOAP11BindingJAXWS.createFaultMessageFromException(SOAP11BindingJAXWS.java:102)
at org.jboss.ws.core.CommonSOAPBinding.bindFaultMessage(CommonSOAPBinding.java:671)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.processRequest(RequestHandlerImpl.java:496)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleRequest(RequestHandlerImpl.java:295)
... 24 more
找不半天都不知道原因何在,如果有知道的童鞋还望分享一下。
再来看看
JDK:1.6
JBoss:5.X
不知道是不是我配置有问题,因为,看上面的文档说,JDK6的话不用把包全部引入进去,只需替换几个进行,都是,之后那个ANT配置文件我就不知道怎么写啦,因此,还是用了JDK5那个方法,有知道的童鞋麻烦告诉我一下,谢谢啦!