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,是优选的; 程序化方式也是可以接受的 - 但只有在保持可移植性的情况下.
Glassfish 使用 MOXy 作为默认提供程序。它内部有处理 Jackson、Jettison 和 MOXy 的库,但默认是 MOXy。有两种方法可以禁用 MOXy
jersey.config.server.disableMoxyJson为true。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)
您可以注册JacksonJsonProvider或JacksonJaxbJsonProvider以获得 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
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |