2012-10-02 87 views
4

情境

我正在將Apache CXF 2.6.2的Web服務部署到Tomcat服務器。我出口使用CXFServlet和下面的Spring基於配置的服務:獲取CXF端點的URL

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:jaxws="http://cxf.apache.org/jaxws" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> 
    <import resource="classpath:META-INF/cxf/cxf.xml"/> 
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> 

    <jaxws:endpoint id="test_endpoint" 
        implementor="org.xyz.TestImpl" 
        address="/test"/> 

    <bean id="testBean" class="org.xyz.TestBean"> 
     <property name="endpoint" ref="test_endpoint" /> 
    </bean> 
</beans> 

在我的例子部署CXFServlet使用相對路徑/服務,例如通過TestImpl類實現的Web服務可作爲http://domain.com/tomcat-context/services/test TestBean類有一個端點設置器,它由Spring設置。

目標

我想確定地址(URL),這是testBean就採用端點領域中的類由端點test_endpoint提供。結果應該是「http://domain.com/tomcat-context/services/test」。

我已經試過

log.info("Endpoint set to " + endpoint); 
log.info("Address: " + endpoint.getAddress()); 
org.apache.cxf.jaxws.EndpointImpl ep = (org.apache.cxf.jaxws.EndpointImpl) endpoint; 
log.info("Other Address: " + ep.getBindingUri()); 
log.info("Props: " + ep.getProperties()); 

,但結果卻

Address: /Sachbearbeiter 
Other Address: null 
Props: {} 

我怎樣才能得到完整的網址?有沒有辦法獨自建造它?

回答

0

您是否嘗試過繞過CXF消息來查看它是否在某個屬性中?我用駱駝與CXF並獲得實際的CXF的消息是這樣的:

Message cxfMessage = exchange.getIn().getHeader(CxfConstants.CAMEL_CXF_MESSAGE, Message.class); 

你應該能夠得到CXF郵件中只是普通的CXF像這樣:

PhaseInterceptorChain.getCurrentMessage() 

看到這個網址:Is there a way to access the CXF message exchange from a JAX-RS REST Resource within CXF?

從那裏,你可以得到的屬性,如:

org.apache.cxf.request.url=someDomain/myURL 
0

您可以構建具有以下代碼的網址。並且您可以根據您的環境進行適當的編輯。

String requestURI = (String) message.get(Message.class.getName() + ".REQUEST_URI"); 
Map<String, List<String>> headers = CastUtils.cast((Map) message.get(Message.PROTOCOL_HEADERS)); 
List sa = null; 
String hostName=null; 
    if (headers != null) { 
      sa = headers.get("host"); 
     } 

     if (sa != null && sa.size() == 1) { 
      hostName = "http://"+ sa.get(0).toString()+requestURI; 
     } 
1

我有同樣的要求。但是,我認爲從端點定義中檢索主機和端口是不可能的。正如你所提到的,endpoint.getAddress()只是提供服務名稱而不是整個網址。這裏是我的理由:

讓我們來看看預期端點地址:http://domain.com/tomcat-context/CXFServlet-pattern/test

CXF運行在servlet容器中運行。中間兩部分(tomcat-context/CXFServlet-pattern)實際上是由servlet容器處理的,可以從ServletContext中檢索。你可以在Spring中實現org.springframework.web.context.ServletContextAware。最後一部分(服務名稱爲test)由CXF處理,可通過endpoint.getAddress()進行檢索。但第一部分爲schema://host:port超出此範圍,且受控於主機配置。例如,您的服務可能同時收到http://domain.comhttps://doman.com的請求,並且在部署服務時CXF運行時永遠不會知道它。但是,當請求到達時,可以從請求或消息中檢索,如其他帖子中提到的。

HTH