使用GlassFish v4自定义JSON marhsalling

Mar*_*idt 5 glassfish jax-rs jersey jackson moxy

我们有一个在Apache TomEE上运行的JAX-RS应用程序.我们稍微定制默认的Jettison提供程序,以更好地遵守JavaScript前端使用的JSON约定.TomEE允许通过其resources.xml文件执行此操作:

<resources>
    <Service id="jettison" class-name="org.apache.cxf.jaxrs.provider.json.JSONProvider">
        serializeAsArray = true
        dropRootElement = false
        arrayKeys = members,roles
        supportUnwrapped = true
        writeXsiType = false
    </Service>
</resources>
Run Code Online (Sandbox Code Playgroud)

现在我们正在迁移到GlassFish v4.1,我们注意到JSON输出与我们在TomEE中的输出不同 - 因此完全打破了前端.我正在寻找类似的机制来自定义GlassFish中的JSON编组器.事实上,我已经有点坚持与新泽西州,莫西,杰克逊,抛弃.我们如何知道实际使用哪个JSON提供程序?我们如何选择一个?我们如何定制行为?

该应用程序是纯JAX-RS,不直接使用任何JSON处理器,而是依赖于JAXB注释类的编组.引入任何非JavaEE依赖项是非常不受欢迎的,因为该应用程序旨在跨容器移植(TomEE,GlassFish,某天WildFly).配置文件方法,类似于TomEE,是优选的; 程序化方式也是可以接受的 - 但只有在保持可移植性的情况下.

Pau*_*tha 2

Glassfish 使用 MOXy 作为默认提供程序。它内部处理 Jackson、Jettison 和 MOXy 的库,但默认是 MOXy。有两种方法可以禁用 MOXy

  1. 将 Jersey 属性设置jersey.config.server.disableMoxyJsontrue
  2. 注册一个XxxJsonFeature禁用 MOXy 的不同版本。例如JacksonFeature附带的jersey-media-json-jackson

请注意,Glassfish 附带了 Jackson 提供程序,但它是 Jackson 1.x。如果您想使用 2.x,而不是使用jersey-media-json-jackson上面列出的依赖项,最好使用底层 Jackson 提供程序依赖项,即

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.6.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

您可以注册JacksonJsonProviderJacksonJaxbJsonProvider以获得 JAXB 注释支持。

要配置 Jackson,最简单的方法是实现,如这个答案ContextResolver中所示。将查找此值以检索用于(反)序列化的内容。JacksonJsonProviderContextResolverObjectMapper

您还需要记住禁用 MOXy,如上所述。

另外需要注意的是,该解决方案可移植的。对于 JAX-RS,唯一可移植的应用程序配置是通过Application子类

@ApplicationPath("/api")
public class MyApplication extends Application {}
Run Code Online (Sandbox Code Playgroud)

话虽这么说,在 Glassfish 中禁用 MOXy 无非是设置一个属性。在Application类中,您可以重写getProperties()返回Map<String, Object>. 您可以在此处设置属性。因为它只不过是一个字符串(没有外部依赖项),所以它仍然是可移植的

@ApplicationPath("/api")
public class MyApplication extends Application {
    @Override
    public Map<String, Object> getProperties() {
        Map<String, Object> props = new HashMap<>();
        props.put("jersey.config.server.disableMoxyJson", true);
        return props;
    }
}
Run Code Online (Sandbox Code Playgroud)

就上述 Jackson 依赖而言,它也是一个可移植的解决方案。它与(JAX-RS)实现无关。它实现并使用标准 JAX-RS API