EJB3 釋出WebService及客戶端呼叫
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的整個過程了,希望對大家有幫助,當然方式肯定不是隻有這一種,歡迎大家一起交流.