2017-07-28 75 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中。 –