2015-01-20 28 views
5

我们有一个运行在Apache TomEE上的JAX-RS应用程序。我们稍微自定义默认的Jettison提供程序,以更好地遵守JavaScript前端使用的JSON约定。 TomEE允许通过其文件resource.xml的做到这一点:使用GlassFish v4自定义JSON

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

现在我们正在迁移到GlassFish v4.1的,而且我们注意到,JSON输出从我们曾在TomEE不同 - 从而彻底打破了前端。我正在寻找类似的机制来自定义GlassFish中的JSON编组器。事实上,我已经与泽西岛,MOXY,杰克逊,杰蒂森有点stuck。我们如何知道哪个JSON提供者实际使用?我们如何选择一个?我们如何定制行为?

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

回答

2

Glassfish使用MOXy作为默认提供程序。在内部它库处理杰克逊,Jettison和MOXy,但默认是MOXy。有两种方法禁用MOXy

  1. 将泽西岛属性jersey.config.server.disableMoxyJson设置为true
  2. 注册禁用MOXy的其他XxxJsonFeature。例如,JacksonFeature自带jersey-media-json-jackson

请注意,Glassfish附带杰克逊提供者,但它是杰克逊1.x.如果你想使用2.x中,而不是使用上面列出的jersey-media-json-jackson依赖,这将是更好地使用底层杰克逊供应商的依赖,这是

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.6.0</version> 
</dependency> 

您可以注册JacksonJsonProviderJacksonJaxbJsonProvider为JAXB注释支持。

要配置Jackson,实施ContextResolver的最简单方法,如this answer所示。 JacksonJsonProvider将查找此ContextResolver以检索用于(反)序列化的ObjectMapper

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

还有一点要注意的是,这个解决方案便携式。用JAX-RS,唯一的便携式应用的配置是通过一个子类Application

@ApplicationPath("/api") 
public class MyApplication extends Application {} 

这就是说,MOXY在Glassfish的的情况下被停用,无非是设置一个属性更多。在Application课程中,您可以覆盖getProperties(),该课程返回Map<String, Object>。这是您可以设置属性的位置。而且因为它没什么比一个String(无外部依赖性)以上,但它仍然便携式

@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; 
    } 
} 

至于上述杰克逊的依赖,它也是一个便携式解决方案。它没什么特别的(JAX-RS)实现。它实现并使用标准的JAX-RS API

+0

查找关于'jersey.config.server.disableMoxyJson'使我像一天。最后我得到了我的Gson提供者的工作。谢谢! – 2017-12-12 19:32:59