gpt4 book ai didi

java - Spring在数据绑定(bind)期间忽略自定义ObjectMapper

转载 作者:行者123 更新时间:2023-11-30 07:42:01 29 4
gpt4 key购买 nike

我正在尝试为我的服务中的所有端点启用 Jackson 的“未知属性失败”功能。我添加了 Jackson2ObjectMapperBuilder:

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

当我使用注入(inject)的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 直接传递给 Controller ​​时,不会发生验证并且调用方法体:

@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*/
}

是否有一种简单的方法来强制 Controller 和存储库检查传递的 json 是否不包含未知属性?

最佳答案

使用 Spring Data Rest 时,在应用程序上下文中注册了多个 ObjectMappers,例如一种用于 application/hal+json,另一种用于 application/json。看起来 Spring Data Rest 没有使用您配置的主要对象映射器。

如果您想配置 Spring Data Rest 对象映射器,您可以使用 RepositoryRestConfigurerAdapter 来完成此操作 - 请参阅 http://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.configuration

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

关于java - Spring在数据绑定(bind)期间忽略自定义ObjectMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34519893/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com