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



我在application.properties中使用spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=true使反序列化在未知属性上失败,但它不起作用。

我什至尝试使用:

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

但这也没有奏效。我错过了什么?

对于 Spring 引导,默认情况下,在反序列化期间会忽略未知属性。为了不忽略这些属性,您可以:

  • 在应用程序中添加spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=true属性
  • 使用此豆子:

    @Bean
    public ObjectMapper objectMapper() {
        return Jackson2ObjectMapperBuilder
        .json()
        .featuresToEnable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
        .build();
    }
    
  • 使用此豆子:

    @Bean 
    public Jackson2ObjectMapperBuilder objectMapperBuilder(){
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.failOnUnknownProperties(true);
        return builder;
    }
    

我已经测试了这些解决方案并且它有效,因此您的代码中存在另一个问题。拜托,你能按照javaguy的要求发布你的代码吗?

根据

杰克逊文档FAIL_ON_UNKNOWN_PROPERTIES选项默认为真。

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

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

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

这是一个文件的 spring 引导应用程序:

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

未定义标题属性。所以控制器发送错误请求。

相关内容

  • 没有找到相关文章

最新更新