我在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());
}
}
未定义标题属性。所以控制器发送错误请求。