在JBoss 7.1.1上将JSON提供程序设置为RESTEasy

在JBoss 7.1.1上将JSON提供程序设置为RESTEasy,json,jboss7.x,resteasy,Json,Jboss7.x,Resteasy,如何在JBoss 7.1.1上为RestEasy设置JSON提供程序 RestEasy文档说明: RESTEasy允许您将JAXB注释的POJO打包到JSON和从JSON打包。 此提供程序包装抛弃JSON库以实现此目的 但我发现,在JBoss 7.1.1上,Resteasy似乎使用了Jackson provider,因为我的类字段上的@XmlTransient被忽略了,但@JsonIgnore被处理了 我怎么能告诉你用抛弃来代替杰克逊 在Jboss上,我找到了两个提供者。从我现在观察到的情况来看

如何在JBoss 7.1.1上为RestEasy设置JSON提供程序

RestEasy文档说明:

RESTEasy允许您将JAXB注释的POJO打包到JSON和从JSON打包。 此提供程序包装抛弃JSON库以实现此目的

但我发现,在JBoss 7.1.1上,Resteasy似乎使用了Jackson provider,因为我的类字段上的@XmlTransient被忽略了,但@JsonIgnore被处理了

我怎么能告诉你用抛弃来代替杰克逊


在Jboss上,我找到了两个提供者。

从我现在观察到的情况来看,Jackson是Jboss 7.1.2中的默认提供者

首先,RestEasy模块从应用程序的类加载器中隐藏,IMO不应该这样做。 所以我只是申请了

第二个,针对您的问题:要设置特定的提供程序,您需要将其从类加载器的位置中删除,再次转到
module.xml
,并注释掉您不想使用的提供程序-如果Jackson可用,RestEasy使用它;否则它使用抛弃

另外,将它们作为编译时依赖项添加到项目中,以便可以使用它们的特定注释。例如:

    <!-- RestEasy -->
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>jaxrs-api</artifactId>
        <version>2.3.4.Final</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.2</version>
        <scope>provided</scope>
    </dependency>

org.jboss.resteasy
比如说


使用替代提供程序可以轻松地恢复RestEasy。

如果您只想使用不同于标准的模块,可以在特定于jboss的部署描述符中提供

阅读了解详细信息,阅读了解JBoss默认使用的模块

要交换这两个提供程序,请提供带有以下内容的
META-INF/jboss部署结构.xml

这为我切换了提供商

亚历山大

<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.jboss.resteasy.resteasy-jackson-provider" />
    </exclusions>
    <dependencies>
      <module name="org.jboss.resteasy.resteasy-jettison-provider" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

作为ahus1答案的后续:如果您有一个多级部署档案(即一个包含EJB jar和war文件的顶级EAR文件),您需要在包含resteasy/JAX-RS组件的任何子部署上配置排除
org.jboss.resteasy.resteasy jackson provider

例如,在我的部署中,我的REST端点在EJBJAR文件中的EJB之上进行了注释,而我的
@ApplicationPath
-注释的
javax.ws.rs.core.Application
子类激活了RESTEasy,它在我的war文件中。我发现仅将排除放在顶级(EAR)部署(如ahus1的示例中)或EJB jar级部署上的方法是无效的,但我最终通过将排除放在所有3个级别(EAR、EJB、Web)上,得到了易于使用的抛弃,而不是Jackson:



很可能我只需要子部署上的排除,而将其放在主EAR部署上是多余的;我没有这样尝试,因为现在把它放在这三个选项上似乎效果很好。

我把这一行添加到standalone.conf.bat/sh中,它解决了我的问题


设置“JAVA\u OPTS=%JAVA\u OPTS%-Dcom.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true”

我在文档中找到下一个:
如果类路径中有resteasy-jackson-provider-xxx.jar,将触发jackson JSON提供程序。这将破坏依赖于抛弃JAXB/JSon提供程序的代码。如果您一直在使用抛弃JAXB/Json提供程序,则必须从WEB-INF/lib或类路径中删除Jackson,或者在JAXB类上使用@NoJackson注释。
我用@NoJackson注释标记了我的类,但此后我的服务开始返回XML字符串响应,而不是预期的Json。因此@NoJackson对我没有帮助。顺便说一句,它与类加载行为无关,它只是记录警告,如果您直接从应用程序使用该模块,则该模块是私有的,可能会更改,注意更多。有人可以明确说明Jackson或Destinson是默认的提供程序吗?医生说放弃,所以我很困惑。太好了,这救了我一天。谢谢
<?xml version="1.0" encoding="UTF-8" ?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jettison-provider" />
        </dependencies>
    </deployment>
    <sub-deployment name="MyApp-ejb.jar">
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jettison-provider" />
        </dependencies>
    </sub-deployment>
    <sub-deployment name="MyApp.war">
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jettison-provider" />
        </dependencies>
    </sub-deployment>
</jboss-deployment-structure>