0

CXF JAX-WS でクライアント IP アドレスを確実に取得する機能が必要なので、Web サービスに次のコードを追加しました。

Message message = PhaseInterceptorChain.getCurrentMessage();
HttpServletRequest request = (HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);
request.getRemoteAddr();

ビルドを正常に完了するために、次のインポートを追加する必要がありました。

import javax.servlet.http.HttpServletRequest;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.PhaseInterceptorChain;
import org.apache.cxf.transport.http.AbstractHTTPDestination;

そして、次の依存関係を my に追加しますpom.xml

    <dependency> <!-- PhaseInterceptorChain & Message -->
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-api</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>2.2.3</version>
    </dependency>
    <dependency> <!-- HttpServletRequest -->
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <!-- scope>provided</scope -->
    </dependency>

しかし、結果として成功した (!) ビルドをデプロイしようとすると、Tomcat (7.0.42) は例外をスローし、war ファイルのロードを拒否します。

org.springframework.beans.factory.BeanDefinitionStoreException: 
  Unexpected exception parsing XML document from class path resource [beans.xml]; 
    nested exception is org.springframework.beans.FatalBeanException: 
      Invalid NamespaceHandler class [org.apache.cxf.jaxws.spring.NamespaceHandler] for namespace [http://cxf.apache.org/jaxws]: 
        problem with handler class file or dependent class; 
          nested exception is java.lang.NoClassDefFoundError: org/apache/cxf/endpoint/AbstractEndpointFactory

...

Caused by: org.springframework.beans.FatalBeanException: 
  Invalid NamespaceHandler class [org.apache.cxf.jaxws.spring.NamespaceHandler] 
   for namespace [http://cxf.apache.org/jaxws]: 
    problem with handler class file or dependent class; 
     nested exception is java.lang.NoClassDefFoundError: org/apache/cxf/endpoint/AbstractEndpointFactory

...

Caused by: java.lang.ClassNotFoundException: org.apache.cxf.endpoint.AbstractEndpointFactory
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)

どうやら、pom.xml実行時に必要なモジュールを提供する my に何かが欠けているようです。私は何が欠けていますか?

4

1 に答える 1

1

謎が解けました。すべての利益のために、問題の根本原因と解決策を提供しています。

問題は次の行にありました。

   <version>2.4.0</version>

つまり、cxf-apiアーティファクトのバージョンは、プロジェクト (および pom.xml) 全体で CXF のバージョンと一致しませんでした。

問題を解決するために私がしなければならなかったのは、その行を次のように変更することだけでした:

<version>${cxf.version}</version>

wherecxf.versionは以前に として定義されていました2.7.1

結論: CXF の依存関係/パッケージ/プラグインのバージョンは、pom.xml 全体で一致する必要があります (そうしないと、"赤いニシン" が発生します)。

于 2013-10-18T16:27:04.547 に答える