Java Spring在数据绑定期间忽略自定义ObjectMapper
我正在尝试为我的服务中的所有端点启用Jackson的“未知属性失败”功能。我添加了Java Spring在数据绑定期间忽略自定义ObjectMapper,java,spring,spring-boot,jackson,spring-data-rest,Java,Spring,Spring Boot,Jackson,Spring Data Rest,我正在尝试为我的服务中的所有端点启用Jackson的“未知属性失败”功能。我添加了Jackson2ObjectMapperBuilder: @Configuration public class JacksonConfig{ @Bean public Jackson2ObjectMapperBuilder objectMapperBuilder(){ Jackson2ObjectMapperBuilder builder = new Jackson2Obj
Jackson2ObjectMapperBuilder
:
@Configuration
public class JacksonConfig{
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder(){
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.failOnUnknownProperties(true);
return builder;
}
}
当我使用injectedObjectMapper
时,验证工作正常,它在传递无效json时抛出HttpMessageEndableException
:
public class Person{
@NotNull
private String name;
@NotNull
private String surname;
/*getters and setters*/
}
@Autowired
private ObjectMapper objectMapper;
Person person = objectMapper.readValue("{ "\unknown\":\"field\", \"name\":\"John\", \"surname\":\"Smith\" }", Person.class);
但是,当我将相同的json直接传递给控制器时,不会发生验证,并且会调用方法体:
@RequestMapping(value = "/something", method = RequestMethod.POST)
public void something(@Valid @RequestBody Person person){...}
首先,我认为MessageConverter
不使用自定义ObjectMapper
,所以我检查了它:
@Autowired
private MappingJackson2HttpMessageConverter converter;
converter.getObjectMapper().getDeserializationConfig().hasDeserializationFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES.getMask()));
//returns true
更奇怪的是,当我在服务的其他部分使用存储库时,验证在POST方法中工作,但在PUT方法中不工作
@RepositoryRestResource(collectionResourceRel = "...", path = "...")
public interface CarRepository extends CrudRepository<Car, Long> {
@Override
@PreAuthorize("hasRole('ROLE_ADMIN') || hasPermission(#car, T(...).CREATE_OR_MODIFY")
Car save(@Param("car") Car car);
/*other methods*/
}
@RepositoryRestResource(collectionResourceRel=“…”,path=“…”)
公共接口存储扩展了crudepository{
@凌驾
@预授权(“hasRole('ROLE_ADMIN')| | hasPermission(#car,T(…)。创建或修改”)
Car save(@Param(“Car”)Car-Car);
/*其他方法*/
}
有没有一种简单的方法可以强制控制器和存储库检查传递的json是否不包含未知属性?使用spring data rest时,在应用程序上下文中注册了多个ObjectMapper,例如一个用于application/hal+json,另一个用于application/json。看起来spring data rest没有使用p您配置的一元对象映射器 如果要配置spring数据rest对象映射器,可以使用
RepositoryRestConfigurerAdapter
-请参阅
我在一个类似的问题上损失了3个小时的生命,因为我的一个配置类上有
@EnableWebMvc
。请确保您没有。我已经从代码中删除了该注释,但没有任何帮助。@JBNizet非常感谢,保存了我的ass感谢您的响应,但添加它并没有改变任何事情。正如我所写的,验证与repositorie一起工作s和POST请求。当我使用无效id(数据库中不存在)放置请求时,它也可以工作但它不会抛出带有良好id请求的HttpMessageNodeEnableException
。它看起来像是在通过身份验证时,Spring使用了错误的MessageConverter
/忽略了ObjectMapper
功能。这不仅是存储库的问题,控制器也不能正常工作。
public class DefaultRepositoryRestConfigurerAdapter extends RepositoryRestConfigurerAdapter {
@Autowired(required = false)
private Jackson2ObjectMapperBuilder objectMapperBuilder;
@Override
public void configureJacksonObjectMapper(ObjectMapper objectMapper) {
if (this.objectMapperBuilder != null) {
this.objectMapperBuilder.configure(objectMapper);
}
}
}