Spring在数据绑定期间忽略自定义ObjectMapper

时间:2015-12-29 22:11:54

标签: java spring spring-boot jackson spring-data-rest

我正在尝试为我服务中的所有端点启用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是否包含未知属性?

1 个答案:

答案 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