现在的位置: 首页 > 综合 > 正文

在JBoss中开发EJB容器模型的WebService

2014年02月04日 ⁄ 综合 ⁄ 共 9842字 ⁄ 字号 评论关闭

我们先来了解一下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那个方法,有知道的童鞋麻烦告诉我一下,谢谢啦!

抱歉!评论已关闭.