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によって設定されます。

ゴール

endpoint フィールドを使用して、クラス 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 メッセージを調べてみて、それがプロパティの 1 つにあるかどうかを確認しましたか? CXF で Camel を使用し、次のような実際の CXF メッセージを取得します。

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

次のように、単純な CXF で CXF メッセージを取得できるはずです。

PhaseInterceptorChain.getCurrentMessage()

次のURL を参照してください: 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
于 2013-02-14T03:49:51.930 に答える
1

私は同じ要件を持っていました。ただ、エンドポイントの定義だけからホストとポートを取得するのは無理だと思います。そして、あなたが言及したように、endpoint.getAddress()URL全体ではなくサービス名を与えるだけです。これが私の理由です:

予想されるエンドポイント アドレスを調べてみましょう: http://domain.com/tomcat-context/CXFServlet-pattern/test

CXF ランタイムはサーブレット コンテナーで実行されます。真ん中の 2 つの部分 ( tomcat-context/CXFServlet-pattern) は、実際にはサーブレット コンテナーによって処理され、 から取得できますServletContextorg.springframework.web.context.ServletContextAwareSpringで実装できます。最後の部分 (testサービス名) は CXF によって処理され、 によって取得できます。endpoint.getAddress()ただし、最初の部分はこれschema://host:portを超えており、ホスト構成によって制御されます。たとえば、サービスはhttp://domain.comまたはの両方へのリクエストを受け取ることができhttps://doman.com、CXF ランタイムはサービスがデプロイされたときにそれを認識しません。ただし、リクエストが来ると、他の人の投稿に記載されているように、リクエストまたはメッセージから取得できました。

HTH

于 2014-06-27T12:02:09.493 に答える
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 に答える