2017-07-28 65 views
0

我与Maven的依赖春季启动项目:com.fasterxml.jackson.datatypeJava的春季启动申请配置FasterXml杰克逊库

而且我想启用两个属性ACCEPT_EMPTY_STRING_AS_NULL_OBJECT和FAIL_ON_READING_DUP_TREE_KEY。

,但未能两个使能他们两种不同的方式: 1)application.yml

jackson: 
     serialization: 
      WRITE_DATES_AS_TIMESTAMPS: false 
     deserialization: 
       FAIL_ON_READING_DUP_TREE_KEY: true 

2)将其添加为配置Bean

@Configuration 
public class JacksonConfiguration { 

    @Autowired 
    private ObjectMapper objectMapper; 

    @PostConstruct 
    private void configureObjectMapper() { 
     objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); 
     objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY); 
    } 
} 

无论这种方式之一给了我想要的效果。你能请教正确的方法如何做到这一点?

+0

'objectMapper'是如何创建的? – Berger

+0

它由Spring框架创建并创建并注入参考。 –

回答

0

创建并从头开始配置ObjectMapper

@Configuration 
public class JacksonConfiguration { 

    @Bean 
    public ObjectMapper objectMapper() { 
     return new ObjectMapper() 
       .enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT) 
       .enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY); 
    } 
} 
+0

你的回应是正确的方式,如何定义将在全球范围内使用的Spring Bean。我实际上改变我的代码: @Bean public ObjectMapper objectMapper(){ final ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY); return objectMapper; } –

+0

除了“定义将在应用上全局使用的Spring Bean”之外,你还想要其他吗? –

+0

也许我错过了一些东西,但是当用户在API中传递空弹簧并启用严格JSON并在请求正文中出现重复属性时,我希望在Request body属性中具有空值。 这是我想用ACCEPT_EMPTY_STRI NG_AS_NULL_OBJECT和FAIL_ON_READING_D UP_TREE_KEY –

0

我试图使用FasterXml杰克逊两个选项:

  1. ACCEPT_EMPTY_STRING_AS_NULL_OBJECT自动映射空 字符串NULL值。并且看起来好像它不能正常工作喷墨 ,根据 https://github.com/FasterXML/jackson-databind/issues/1563所以我 解决了编写自定义反串行器的问题。
  2. FAIL_ON_READING_D UP_TREE_KEY启用严格的JSON验证,但使用JsonParser.Feature.STRICT_DUPLICATE_DETECTION获得所需的效果。

所以现在我结束了两个工作方案:

@Bean 
    public ObjectMapper objectMapper() { 
     final ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.registerModule(new JavaTimeModule()); 
     objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
     objectMapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); 
     return objectMapper; 
    } 

和application.yml

jackson: 
    serialization: 
     WRITE_DATES_AS_TIMESTAMPS: false 
    parser: 
      STRICT_DUPLICATE_DETECTION: true 

我会application.yml使用,当然,保持配置紧凑,一个地方。

感谢@Michal Foksa我会接受你的答案,因为这是如何正确配置ObjectMapper的方法之一。

+0

您可以/应该使用ObjectMapperBuilder,如果在类路径中找到,则会自动添加像JavaTimeModule这样的模块。定义为bean的任何'Module'都将被添加到ObjectMapper中。 –