使用GlassFish v4定制JSON marhsalling

使用GlassFish v4定制JSON marhsalling,glassfish,jersey,jackson,jax-rs,moxy,Glassfish,Jersey,Jackson,Jax Rs,Moxy,我们有一个在ApacheTome上运行的JAX-RS应用程序。我们稍微定制了默认的抛弃提供程序,以便更好地遵守JavaScript前端使用的JSON约定。TomEE允许通过其resources.xml文件执行此操作: <resources> <Service id="jettison" class-name="org.apache.cxf.jaxrs.provider.json.JSONProvider"> serializeAsArray = t

我们有一个在ApacheTome上运行的JAX-RS应用程序。我们稍微定制了默认的抛弃提供程序,以便更好地遵守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>

序列化阵列=true
dropRootElement=false
arrayKeys=成员、角色
supportUnwrapped=true
writeXsiType=false
现在我们正在迁移到GlassFish v4.1,我们注意到JSON输出与我们在TomEE中的不同,因此完全打破了前端。我正在寻找类似的机制来定制GlassFish中的JSON marshaller。事实上,我已经有点喜欢泽西、莫西、杰克逊和抛弃。我们如何知道实际使用的是哪个JSON提供程序?我们如何选择一个?我们如何定制行为


该应用程序是纯JAX-RS,不直接使用任何JSON处理器,而是依赖于JAXB注释类的编组。引入任何非JavaEE依赖项都是非常不可取的,因为应用程序旨在跨容器(TomEE、GlassFish、有朝一日的WildFly)进行移植。与TOME类似的配置文件方法更可取;编程方式也是可以接受的,但前提是保持可移植性。

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

  • 将Jersey属性设置为
    true
  • 注册另一个禁用MOXy的
    XxxJsonFeature
    。例如,随附的
  • 请注意,Glassfish附带了一个Jackson提供者,但它是Jackson 1.x。如果您想使用2.x,而不是使用上面列出的
    jersey-media-json-jackson
    依赖项,最好使用底层的jackson-provider依赖项,即

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.6.0</version>
    </dependency>
    
    也就是说,在Glassfish的情况下禁用MOXy只不过是设置一个属性。在
    应用程序
    类中,您可以重写
    getProperties()
    ,它返回一个
    映射
    。在这里可以设置属性。因为它只不过是一个字符串(没有外部依赖项),所以它仍然是可移植的

    @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;
        }
    }
    
    @ApplicationPath(“/api”)
    公共类MyApplication扩展了应用程序{
    @凌驾
    公共映射getProperties(){
    Map props=newhashmap();
    put(“jersey.config.server.disableMoxyJson”,true);
    返回道具;
    }
    }
    

    就上述Jackson依赖性而言,它也是一个可移植的解决方案。它没有任何特定于JAX-RS的实现。它实现并使用标准JAX-RSAPI

    查找
    jersey.config.server.disableMoxyJson
    花了我一天的时间。我终于让我的Gson提供商开始工作了。谢谢
    @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;
        }
    }