setProperty必须被SOAPMessage的所有子类重写

35

我正在尝试在JBoss 5.1.0上部署一些WAR应用程序中的Web服务。

我使用JAX-WS工具wsgen从现有的wsdl创建了源文件。这会创建Service文件和带注释的@XmlType类,这些类将充当请求和响应包装器。

这些类在JBoss 4.2.3上运行良好,但是当迁移到JBoss 5.1.0时,我会得到这个异常。

  

java.lang.UnsupportedOperationException:SOAPMessage的所有子类都必须重写setProperty方法

我的配置:

  • Windows XP SP3(但在Vista以及Linux上也会出现同样的问题)
  • Sun JDK 1.6.0_17
  • 适用于jdk6的JBoss 5.1.0 GA

提前感谢您!

12个回答

33

有一些可能出错的事情,所以我会告诉你在我的情况下(类似于您的情况),我采取了什么措施来解决问题(我使用的是JDK 1.6.0_13)。

问题在于JAR包不匹配。首先,请确保JBoss使用JDK 1.6,检查JAVA_HOME环境变量。其次,请确保您的类是使用JDK 1.6编译的。如果您从Eclipse运行项目,请确保Eclipse正在使用正确的JDK;如果您从Eclipse运行JBoss,也是同样的操作。

我猜您已经做到了这点,现在开始一些神奇的操作。运行客户端不要使用$JBOSS_HOME/client中的库,而是只使用$JBOSS_HOME/lib/endorsed中提供的库。当然,如果您正在使用任何其他与JAX-WS无关的API(如JPA或EJB或Servlets),则可以将它们添加到类路径中,但仅使用lib/endorsed JAX-WS JAR文件。

这对于我特定的情况非常有帮助,在JBoss 5.1的早期版本中,还有一些其他技巧可以使用,例如尝试添加Java选项-Dsun.lang.ClassLoader.allowArraySyntax=true或/和-Djava.endorsed.dirs=$JBOSS_HOME/lib/endorsed,当您启动客户端和JBoss时。


2
谢谢Piotr!毕竟,问题是我从eclipse中启动JBoss,使用它的自动启动配置...这不会传递-Djava.endorsed.dirs=$JBOSS_HOME/lib/endorsed参数。在添加此参数后(以及从run.bat脚本运行JBoss),它正常工作了。再次感谢!(你应该得到比我一个赞更多的奖励 :)) - Pablo Venturino
尝试了"-Dsun.lang.ClassLoader.allowArraySyntax=true"和"-Djava.endorsed.dirs=$JBOSS_HOME/lib/endorsed"两种方法,但在4.2.3.GA版本中均未生效。 - Brian Harris
我认为这种解决方法相当糟糕,因为它可能会影响其他已部署的应用程序,并使工业化过程更加困难。范围应该限制在应用程序包(如类加载器配置/过滤器)内。 - Donatello

24

我曾经在从JBoss 4.2.2升级时遇到了同样的问题,在JBoss 5.1.0发布说明中找到了答案:

JBossAS 5.0.0.GA可以使用Java5和Java6进行编译。使用Java5编译的二进制文件是我们主要/推荐的二进制发行版。它已经经过严格的测试,可以在Java 5和Java 6运行时下运行。在Java 6下运行时,您需要手动将以下库从JBOSS_HOME/client目录复制到JBOSS_HOME/lib/endorsed目录,以便使用JBossWS支持的JAX-WS 2.0 API:

  • jbossws-native-saaj.jar
  • jbossws-native-jaxrpc.jar
  • jbossws-native-jaxws.jar
  • jbossws-native-jaxws-ext.jar

我正在使用使用Java 5构建的JBoss 5.1.0版本(在JDK 1.6.0_20上运行),果然将这些JAR文件复制到endorsed目录中就解决了问题。由于注意到以下内容,我们没有使用针对Java 6编译的版本:

然而需要注意的是,JBoss AS 5的Java 6版本仍处于试验阶段。


7

这可能是由于SAAJ jar冲突问题引起的。请将JbossSaaj jar从{Jboss_HOME}/LIB复制到{JBOSS_HOME}/lib/endorsed中。希望这能帮助解决问题。


4
在jboss-4.2.3.GA上,将 jboss/server/<config>/lib 目录下的 jboss-saaj.jar 复制到 jboss/lib/endorsed 目录下可解决问题。 - Roland Schneider

4

请确保使用指向认可库的jvm选项启动JBoss。如果您使用WTP从Eclipse启动JBoss,则默认情况下不会配置此选项,但是如果您从命令行启动JBoss,则会配置此选项。

您可以将以下内容添加到启动配置的VM参数中:

-Djava.endorsed.dirs="${JBOSS_HOME}\jboss-as\lib\endorsed"

值得注意的是,Eclipse不会在运行目标的JVM选项中展开$JBOSS_HOME。 - David Mann
哇,今天我又回到这里了,甚至都不记得第一次来了! - David Mann

2
尝试将以下jar包添加到您的jboss/lib/endorsed文件夹中。
jbossws-native-jaxws.jar
jbossws-native-jaxrpc.jar
jbossws-native-saaj.jar
jbossws-native-saaj.jar

1
我的项目仅仅基于以下几点:
  • CXF 2.5.0 (Soap WebService Consumer)
  • WAR组装(没有EAR)
  • 没有jboss-web
  • 没有jboss-classloading
  • 在jboss/lib/endorsed中没有更改(只有xalan, serializer, xercesImpl)
  • 运行在jboss-4.2.1.GA + JDK 1.6 上
对我而言,它的工作原理就是在CXF附近添加这些Maven依赖项:
    <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-tools</artifactId>
    </dependency>
    <dependency>
        <groupId>org.codehaus.woodstox</groupId>
        <artifactId>woodstox-core-asl</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.messaging.saaj</groupId>
        <artifactId>saaj-impl</artifactId>
    </dependency>

希望能有所帮助!

0

我从CXF发行版中复制了必要的库(在我的情况下是saaj-impl),并使用以下内容的文件/WEB-INF/jboss-classloader.xml打开了JBoss类加载器隔离:


<classloading xmlns="urn:jboss:classloading:1.0"
    domain="MyDomain"
    export-all="NON_EMPTY"
    import-all="true">
</classloading>

希望这对某人有所帮助。


0
将 saaj-impl 添加到我的Web应用程序的lib文件夹中解决了这个错误。我正在使用JBoss 4.2.3和CXF 2.4.10。

0

我的服务器配置是 Jboss AS 4.2.1 GA,像下面这样工作;

我在 lib\endorsed 中使用的库;

  • JAXWS2.1.1_20070501
  • jbossws-native-jaxrpc
  • jbossws-native-jaxws
  • jbossws-native-jaxws-ext
  • jbossws-native-saaj
  • serializer
  • xalan
  • xercesImpl

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接