5

JDK 1.6.0_31-b05 で JDeveloper 11g R2(11.1.2.3.0) を使用して、JAX WS (2.1) Web サービスを含むアプリケーションを実行しようとしています。エラーは、クラスに存在する @WebService アノテーションから発生しています。
アプリケーションを実行していると、以下のエラーが発生します。

java.lang.IllegalArgumentException: Argument(s) "type" can't be null.
  at com.sun.xml.bind.api.TypeReference.<init>(TypeReference.java:89)
  at com.sun.xml.ws.model.RuntimeModeler.processDocWrappedMethod(RuntimeModeler.java:758)
  at com.sun.xml.ws.model.RuntimeModeler.processMethod(RuntimeModeler.java:678)
  at com.sun.xml.ws.model.RuntimeModeler.processClass(RuntimeModeler.java:428)
  at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:277)
  at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:363)
  at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:202)
  at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:496)
  at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:539)
  at weblogic.wsee.jaxws.JAXWSDeployedServlet.getEndpoint(JAXWSDeployedServlet.java:183)

組み込みの Web Logic は、JDK から提供されるライブラリではなく、内部ライブラリを使用しているようです。クラスRuntimeModelerまたはTypeReferenceJDK rt.jar に存在するものは、パッケージ com.sun.xml.ws.internal で始まります。Weblogic はこれらのクラスを glassfish.jaxb_1.0.0.0_2-1-12.jar および glassfish.jaxws.rt_1.2.0.0_2-1-5.jar から選択していますが、これらの jar はアプリケーションの一部ではありません。

  1. 以下のタグで weblogic.xml を既に使用しています。

    <prefer-web-inf-classes>true</prefer-web-inf-classes>
    
  2. DefaultDomain/lib ディレクトリに jaxws-api.jar と jws-api.jar を追加しようとしましたが、うまくいきませんでした

この例外を解決する方法、または weblogic に jdk ランタイム クラスを使用させる方法の手がかりはありますか? 同じアプリケーションがスタンドアロンの weblogic で適切に動作します。

4

3 に答える 3

1

私は同じ問題を抱えていて、ここで答えを見つけました: http://www.intropro.com/resources/blog/66-argument-s-type-can-t-be-null

つまり、WebLogics 独自の jaxb をオーバーライドするクラスパスに jaxb-impl があるため、問題が発生します。pom.xml からこの依存関係を明示的に参照することはできませんが、他の依存関係の一部は参照します。私の場合、maven 依存関係として apache-cxf があり、スコープが「コンパイル」のサブ依存関係として jaxb 2.1.13 がありました。私がしなければならなかったのは、このApache jaxbを除外し、WebLogics jaxbを明示的に使用するためにスコープが「提供」された独自の依存関係を追加することだけです。

pom.xml では、次のようになりました。

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>2.7.2</version>
    <exclusions>
        <exclusion>
            <artifactId>jaxb-impl</artifactId>
            <groupId>com.sun.xml.bind</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <scope>provided</scope>
    <version>2.1.13</version>
</dependency>

eclipses の pom.xml ビューの「依存関係階層」タブ、または単純にコマンドライン「mvn dependency:tree」を使用して、jaxb-impl がどのようにクラスパスに到達したかを確認できます。

于 2015-06-05T08:01:05.727 に答える
0

マニフェストの class-path: 属性に正しい jar をリストしようとしましたか? jdk クラスをアプリに配置し、FilteringClassLoader を使用して、システム クラスローダーではなくアプリから使用するクラスを指定することもできます。

http://docs.oracle.com/cd/E15051_01/wls/docs103/programming/classloading.html#wp1097263

于 2013-01-17T17:03:14.277 に答える