7

情况

我正在将带有 Apache CXF 2.6.2 的 Web 服务部署到 Tomcat 服务器。我正在使用 CXFServlet 和以下基于 Spring 的配置导出服务:

<?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 使用相对路径 /service,例如 TestImpl 类实现的 Web 服务可作为http://domain.com/tomcat-context/services/test 使用 TestBean 类有一个端点设置器和它是由 Spring 设置的。

目标

我想使用端点字段确定 TestBean 类中的端点 test_endpoint 提供的地址(URL)。结果应该是“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: {}

如何获得完整的 URL?有没有办法不用我自己构建?

4

3 回答 3

2

您是否尝试过查看 CXF 消息以查看它是否在其中一个属性中?我将 Camel 与 CXF 一起使用,并获得如下实际的 CXF 消息:

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

您应该能够像这样在普通的 CXF 中获取 CXF 消息:

PhaseInterceptorChain.getCurrentMessage()

请参阅此 URL:有没有办法从 CXF 中的 JAX-RS REST 资源访问 CXF 消息交换?

从那里,您可以获得以下属性:

org.apache.cxf.request.url=someDomain/myURL
于 2013-02-14T03:49:51.930 回答
1

您可以使用以下代码构造 url。您可以根据您的环境进行适当的编辑。

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;
        }
于 2014-02-21T10:33:57.017 回答
1

我有同样的要求。但是,我认为仅从端点定义中检索主机和端口是不可能的。正如您所提到的,endpoint.getAddress()只是给出了服务名称而不是整个 url。这是我的理由:

让我们检查一个预期的端点地址:http ://domain.com/tomcat-context/CXFServlet-pattern/test

CXF 运行时在 servlet 容器上运行。中间两部分 ( tomcat-context/CXFServlet-pattern) 实际上由 servlet 容器处理,可以从ServletContext. 您可以org.springframework.web.context.ServletContextAware在 Spring 中实现。最后一部分(即test服务名称)由 CXF 处理,可以通过. 例如,您的服务可能会同时收到对or的请求,而 CXF 运行时在部署服务时永远不会知道它。但是,当请求到来时,可以从其他帖子中提到的请求或消息中检索它。endpoint.getAddress()schema://host:porthttp://domain.comhttps://doman.com

高温高压

于 2014-06-27T12:02:09.493 回答