Spring Boot 1.4自定义内部杰克逊反序列化

问题描述:

我在application.properties 中使用spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES = true使未反应的属性反序列化失败,但它不起作用。Spring Boot 1.4自定义内部杰克逊反序列化

我甚至使用

@Bean 
ObjectMapper objectMapper() { 
    return Jackson2ObjectMapperBuilder 
     .json() 
     .featuresToEnable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) 
     .build(); 
} 

尝试,但这样也没有工作。我错过了什么?

+0

你可以发布你的代码和你试图反序列化的对象的数据吗? – developer

+0

如果你在这个问题中定义'Jackson2ObjectMapperBuilder',它是否工作:https://*.com/questions/34545997/put-and-post-fail-on-unknown-properties-spring-different-behavior? – Infinity

+0

@Infinity感谢您的快速回复。我也尝试过,但没有工作这是一个普通的项目与弹簧启动网页依赖和PUT请求方法来更新用户(我没有打数据库,我只是记录更新请求测试方法)和平原用户模型没有任何额外的注释。 – Kiba

FAIL_ON_UNKNOWN_PROPERTIES根据Jackson Documentation,选项默认为true。

如果要禁用此设置,您可以将此选项添加到application.properties

spring.jackson.deserialization.fail-on-unknown-properties = false 

但在默认设置下,它按预期工作。所以不需要任何设置。

这是一个文件春天启动应用程序:

@RestController 
@SpringBootApplication 
public class TestOptionApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(TestOptionApplication.class, args); 
    } 

    @PostMapping("/test") 
    public void formTest(@RequestBody final HelloForm form) { 
    } 

    public static class HelloForm { 

     private String name; 

     public String getName() { return name; } 

     public void setName(final String name) { this.name = name; } 
    } 
} 

这是对未知的性能测试排斥集成测试。

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class TestOptionApplicationTest { 

    @Autowired 
    private WebApplicationContext context; 

    @Test 
    public void testFailOnUnknownPropertiesOption() throws Exception { 

     final String text = "{\"name\": \"test\", \"title\": \"test\"}"; 

     MockMvcBuilders 
      .webAppContextSetup(this.context) 
      .build() 
      .perform(post("/test").contentType(MediaType.APPLICATION_JSON).content(text)) 
      .andExpect(status().isBadRequest()); 
    } 
} 

标题属性没有定义。所以控制器发送BadRequest。

+1

感谢您的快速回复。它现在正在工作,我清除了m2缓存并重建它,也许这是一个版本问题。我会在以后检查是什么导致它。我会将其标记为答案。 – Kiba

使用Spring引导时,默认情况下,在反序列化过程中会忽略未知属性。 为了不忽略这些属性,您可以:

@Bean 
public ObjectMapper objectMapper() { 
    return Jackson2ObjectMapperBuilder 
    .json() 
    .featuresToEnable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) 
    .build(); 
} 
  • 使用这个bean:

    @Bean 
    public Jackson2ObjectMapperBuilder objectMapperBuilder(){ 
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
        builder.failOnUnknownProperties(true); 
        return builder; 
    } 
    
    • 在application.properties
    • 使用这个bean添加spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=true

    我已经测试过这些解决方案,它的工作原理在代码中存在另一个问题。 请问,你可以发布你的代码,由javaguy提问吗?

    +0

    感谢您的快速回复。它现在正在工作,我清除了m2缓存并重建它,也许这是一个版本问题。我会在以后检查是什么导致它。我无法将你和Fırat家伙的回复标记为答案。但感谢您的快速回复:)。 – Kiba