jax-ws handler 的詳解及簡單實例
jax-ws handler 的詳解及簡單實例
aop技術(shù)一般用于某個對象的函數(shù)調(diào)用的日志,認證等。
webservice是遠程的函數(shù)調(diào)用,也需要類似的aop方法,舉例jax-ws的webservice,handler就相當(dāng)于aop。
舉一例jax-ws handler例子
先寫個webservice
import javax.jws.HandlerChain;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
@HandlerChain(file="handlers.xml")
public class Hello {
@WebMethod()
public String sayHello(String name) {
return "Hello " + name + ".";
}
}
超級傻瓜的webservice,唯一特別的就是@HandlerChain標注,其中的handlers.xml是一個描述jax-ws 的handler鏈的xml文件,這個文件可以放在與此源文件同一目錄下。
來看一下handlers.xml的內(nèi)容
<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>ServiceSOAPHandler</handler-name>
<handler-class>com.ws.handler.HelloHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
其中定義了handler鏈,鏈里只有一個handler,也可以包括多個handler
再看看handler的具體實現(xiàn):
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class HelloHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
System.out.println(context.get(MessageContext.WSDL_SERVICE).toString());
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
// TODO Auto-generated method stub
return true;
}
@Override
public void close(MessageContext context) {
// TODO Auto-generated method stub
}
@Override
public Set<QName> getHeaders()
{
// TODO Auto-generated method stub
return null;
}
}
一個handler必須實現(xiàn)SOAPHandler或LogicalHandler接口,至于他們兩者的區(qū)別,與Handler接口的關(guān)系,以及<>中的XXXContext的意義,請參考jaxws的spec,這里只是helloworld例子。
所有接口定義的方法實際上我就實現(xiàn)了一個,打印了被調(diào)用的webservice的名字,實際上可以在這里做很多事情,比如修改soap中的內(nèi)容,添加或刪除xml的標簽,添加刪除soap附件,獲取soap相關(guān)的字段,更形象的功能可以有加解密,日志等等。
最后還要做一些相關(guān)配置文件修改:
在web.xml中添加:
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>wsservlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>wsservlet</servlet-name>
<url-pattern>/helloservice</url-pattern>
</servlet-mapping>
實際上當(dāng)有類標有@webservice的標注,容器會自動把他變成一個webservice,但是我試過這里必須要用上面這種方法,也就是利用jaxws的運行時以wsservlet來匹配請求,并且在之前就通過wsservletcontextlistener在初始上下文時就指定加載某個類作為webservice,這個listener會自動檢測webroot下(和web.xml同一目錄)的名為sun-jaxws.xml的文件,其中包含了webservice具體實現(xiàn)的表述。
在這里sun-jaxws.xml的內(nèi)容為:
<endpoints
xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
version="2.0">
<endpoint
name="helloservice"
implementation="com.ws.service.Hello"
url-pattern="/helloservice" />
</endpoints>
這其中指定的那個實現(xiàn)可以是一個有@Webservice的類,也可以是實現(xiàn)Provider接口的類,相關(guān)Provider可以查看官方spec,它是jax-rs的基礎(chǔ)。
打包,部署,我是部署在glassfish里的,找個webservice的測試工具,eclipse jee套裝里有自帶的webservice客戶端測試的。
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Java的接口調(diào)用時的權(quán)限驗證功能的實現(xiàn)
這篇文章主要介紹了Java的接口調(diào)用時的權(quán)限驗證功能的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
關(guān)于Java?中?Future?的?get?方法超時問題
這篇文章主要介紹了Java?中?Future?的?get?方法超時,最常見的理解就是,“超時以后,當(dāng)前線程繼續(xù)執(zhí)行,線程池里的對應(yīng)線程中斷”,真的是這樣嗎?本文給大家詳細介紹,需要的朋友參考下吧2022-06-06

