【问题标题】:Set JSON provider at RESTEasy on JBoss 7.1.1在 JBoss 7.1.1 上的 RESTEasy 中设置 JSON 提供程序
【发布时间】:2012-08-03 14:11:55
【问题描述】:

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

RestEasy 文档说:

RESTEasy 允许您将带有 JAXB 注释的 POJO 编组到 JSON 或从 JSON 编组。 此提供程序包装了 Jettison JSON 库来完成此操作。

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

如何告诉 Resteasy 使用 Jettison 而不是 Jackson?

在 Jboss 上我找到了这两个提供商。

【问题讨论】:

  • 我在文档中找到了下一个:If you have the resteasy-jackson-provider-xxx.jar in your classpath, the Jackson JSON provider will be triggered. This will screw up code that is dependent on the Jettison JAXB/JSon provider. If you had been using the Jettison JAXB/Json providers, you must either remove Jackson from your WEB-INF/lib or classpath, or use the @NoJackson annotation on your JAXB classes. 我用@NoJackson 注释标记了我的课程,但之后我的服务开始返回我的 XML 字符串响应而不是预期的 JSON。所以@NoJackson 对我没有帮助。

标签: json jboss7.x resteasy


【解决方案1】:

从我现在观察到,Jackson 是 JBoss AS 7.1.2 中的默认设置。

首先,RestEasy 模块对应用的类加载器是隐藏的,而 IMO 不应该这样做。 所以我刚刚提交了https://issues.jboss.org/browse/AS7-5605

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

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

    <!-- 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>

注意:在完成 AS7-5605 之前,您需要手动设置版本。 之后(在更高版本的 AS 中),您必须删除这些版本并使用 JBoss BOM 中定义的版本。例如,请参阅JBoss AS QuckStarts

请随时使用替代提供商的create and contribute a QuickStart RestEasy。

【讨论】:

  • 顺便说一句, 与类加载的行为方式有关,它只是记录警告,如果您直接从您的应用程序是私有的,可能会更改,请注意更多。
  • 有人可以明确说明 Jackson 或 Jettison 是默认提供者吗?文档说 Jettison,所以我很困惑。
【解决方案2】:

如果您只想拉取与标准不同的模块,您可以在 jboss 特定的部署描述符中提供它。

阅读https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7了解详情,阅读https://docs.jboss.org/author/display/AS7/Implicit+module+dependencies+for+deployments了解JBoss默认使用的模块。

要交换这两个提供商,请提供META-INF/jboss-deployment-structure.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>

【讨论】:

  • 太好了,这节省了我的时间。谢谢
【解决方案3】:

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

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

<?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>

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

【讨论】:

    【解决方案4】:

    我将此行添加到standalone.conf.bat/sh,它解决了我的问题。

    设置“JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true”

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 2013-11-21
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2012-01-18
      相关资源
      最近更新 更多