EJB3发布WebService很简单,但是在客户端调用上却遇到了太多的问题,差不多一天的时间终于搞定了,下面是整个过程,我的服务器采用Weblogic10.3
发布WebService
/**
* @author 王硕
**/
@WebService
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT)
public interface WS {
public int sum(int x, int y);
}
/**
* @author 王硕
**/
@Stateless
@WebService(serviceName="WSService")
public class WSImpl implements WS {
@WebMethod
public int sum(int x, int y) {
return x + y;
}
}
部署到Weblogic上,WebService就发布成功了,可以查看WL Console, 也可以直接访问http://localhost:7001/WSImpl/WSService?wsdl查看是否成功,这里需要注意的是,WS上的@WebService是必须要有的,因为最后这个接口是要被打成jar供调用Service的客户端使用的,如果没有这个注解的话,Container是无法识别他为一个Service Interface的, 我这里是将session bean作为服务发布的,这样做的好处不少书籍中都介绍了,我这里就不多说了,下面就客户端的调用,我这里建立了一个新的project,过程如下:
/**
* 负责调用WS的Client
* @author 王硕
**/
@WebServiceClient(wsdlLocation="http://localhost:7001/WSImpl/WSService?wsdl")
public class WSProxy extends Service {
public WSProxy(URL wsdlDocumentLocation, QName serviceName) {
super(wsdlDocumentLocation, serviceName);
}
public int proxySum() {
int result = 0;
WS ws = this.getPort(WS.class);
result = ws.sum(1, 1);
return result;
}
}
/**
* @author 王硕
**/
@Local
public interface WSInvoke {
public int sum();
}
/**
* @author 王硕
**/
@Stateless
public class WSInvokeImpl implements WSInvoke {
@WebServiceRef
private WSProxy proxy;
public int sum() {
return proxy.proxySum();
}
public void setProxy(WSProxy proxy) {
this.proxy = proxy;
}
public WSProxy getProxy() {
return proxy;
}
}
将这个session bean注入servlet就可以访问了,这里需要注意的是WS这个接口,这个接口是发布WebService时对应的Service Interface,调用Service的应用一般是独立的应用,当然不会有这个WS,通常如果发布WebService,也会提供相应的Service Interface让你下载加入到自己的应用中,而我们这里只是测试一下,不用那么麻烦,所以可以创建一个与发布时一模一样的WS接口来做测试,但是在创建的时候请注意,这里WS的package必须和发布时的WS的package一致,因为发布时我这里只用了最简单的配置,没有指定发现空间,所以默认采用的是对应的package,所以这里如果是自己创建WS的话,package必须一致,这样Container会根据其package到相应的发布空间查找对应的服务,通常是相应的发布者把对应的Service Interface打成jar供大家下载,加入到自己的应用中,所以package肯定是一致的,所以这里大家还是要注意一些的,以上就是EJB3 发布与调用WebServicer的整个过程了,希望对大家有帮助,当然方式肯定不是只有这一种,欢迎大家一起交流.