8

如何在 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 上,我找到了这两个提供商。

4

4 回答 4

3

如果您只想拉取与标准不同的模块,您可以在 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>
于 2012-11-23T17:09:04.800 回答
2

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

例如,在我的部署中,我的 REST 端点在我的 EJB jar 文件中的 EJB 之上进行了注释,而激活 RESTEasy 的@ApplicationPath-annotated子类在我的 war 文件中。javax.ws.rs.core.Application我发现仅将排除项放在顶级 (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 部署中是多余的;我没有那样尝试,因为现在把它放在所有三个上似乎效果很好。

于 2013-03-12T21:46:33.770 回答
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

随意使用替代提供者创建和贡献RestEasy 的快速入门。

于 2012-09-22T10:34:06.037 回答
0

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

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

于 2013-08-16T13:55:26.927 回答