記錄中
在其中一個項目中,我們使用Apache CXF創建了Web服務,并且一切正常。 只有一個問題Apache CXF使用java.util logger進行日志記錄并用于打印各種日志。 我們的應用程序使用Log4J,因此使用Log4J進行Cxf和控制日志記錄的任務很簡單。
正如Apache CXF站點上提到的,配置記錄器以使用Log4J是一項繁重的任務,這是頁面上所說的:
將文件META-INF / cxf / org.apache.cxf.Logger添加到類路徑,并確保它包含以下內容: org.apache.cxf.common.logging.Log4jLogger
很簡單,您需要將文件添加到META-INF目錄,即可完成。 我們有一個生成戰爭的Maven項目,因此我在META-INF文件夾中創建了該文件,該文件是為戰爭而生成的,即src / main / webapp / META-INF。
現在,該文件存在,但是日志記錄仍然不受控制,CXF仍在使用Java logger。 我花了更多時間來弄清楚自己做錯了什么。 需要更多的努力才能意識到我在“課堂路徑”中錯過了重要的指導。 除WEB-INF之外生成的META-INF文件夾不在類路徑中,戰爭的classes文件夾中需要META-INF文件夾。
回顧了這個問題之后,我錯過了classpath部分是很愚蠢的,但是我也不明白為什么CXF的家伙為什么選擇META-INF文件夾作為他們的配置文件。 META-INF在Java平臺上可用于服務和類加載器。 當框架開始使用它進行配置時,它變得非常模棱兩可,然后有多個文件夾可以玩,這可能使事情變得不清楚。
肥皂處理機
在另一個地方,我們有一個要求,我們需要攔截傳入/傳出的肥皂請求,然后對其進行處理。 Apache CXF提供了可用于完成此任務的攔截器 。 您可以有一些入站和出站,它們將按照要求進行操作。 但是我們使用的是Java附帶的jaxws實現。 我們不打算將現有客戶轉移到CXF,因為我們有很多客戶,所以我們花了很多時間才弄清楚如何使用jaxws完成此工作。
基本上,根據JAX-WS規范,您可以具有一些可以與客戶端一起配置的SoapHandler 。 每當進行SOAP消息交換時,都將調用該處理程序。 在處理程序中,您可以確定這是入站消息還是出站消息,然后執行您的邏輯。 這些是配置處理程序所需的步驟:
創建一個擴展SoapHandler接口的類并實現handle消息方法:
class CustomHandler implements SOAPHandler<SOAPMessageContext>{// TODO: implement other methodspublic boolean handleMessage(SOAPMessageContext context) {// Check for message statusBoolean outboundProperty = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);if (null == outboundProperty || !outboundProperty) {log.debug("not an outbound message");return true;}}
}
處理程序就像servlet過濾器。 他們是一個鏈條,被一個一個地稱呼。 因此,我們需要創建一個XML文件,可以在其中配置所需的所有處理程序。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chainsxmlns:javaee="http://java.sun.com/xml/ns/javaee"xmlns:xsd="http://www.w3.org/2001/XMLSchema"><javaee:handler-chain><javaee:handler><javaee:handler-class>pkg.CustomHandler</javaee:handler-class></javaee:handler></javaee:handler-chain>
</javaee:handler-chains>
配置文件也必須位于類路徑中,因為它將被導入到我們創建的Web服務客戶端中。 完成此操作后,我們需要在Web服務客戶端上啟用此處理程序鏈。
@WebServiceClient(.....)
@HandlerChain(file="handlerFile.xml")
public class SampleServiceImpl extends Service{
}
處理程序概念來自jaxws規范,可在其所有實現(例如Metro,CXF等)上使用。
參考:在“到目前為止的道路……”中 ,我們的JCG合作伙伴 Rahul Sharma所 提供的Web服務經驗 。 博客 。
- Apache CXF負載平衡和故障轉移
- Ruby,Python和Java中的Web服務
- 帶有Spring和Maven教程的JAX–WS
- Spring3 RESTful Web服務
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/11/web-service-learnings-with-apache-cxf.html