我正在尝试为我服务中的所有端点启用Jackson的“未知属性失败”功能。我添加了Jackson2ObjectMapperBuilder
:
@Configuration
public class JacksonConfig{
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder(){
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.failOnUnknownProperties(true);
return builder;
}
}
当我使用注入ObjectMapper
时,验证按预期工作,它会在传递无效的json时抛出HttpMessageNotReadableException
:
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*/
}
是否有一种简单的方法可以强制控制器和存储库检查传递的json是否包含未知属性?
答案 0 :(得分:1)
当使用spring数据休息时,在应用程序上下文中注册了多个ObjectMapper,例如一个用于application / hal + json,一个用于application / json。看起来spring数据休息时没有使用您配置的主对象映射器。
如果要配置弹簧数据休息对象映射器,可以使用.header-area-custom .site-branding {box-shadow:none;}
执行此操作 - 请参阅http://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.configuration
RepositoryRestConfigurerAdapter