我们先来了解一下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://www.voidcn.com/article/p-darpttmi-bac.html
编译完之后你可以在后台进行查看,输入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那个方法,有知道的童鞋麻烦告诉我一下,谢谢啦!