Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring在数据绑定期间忽略自定义ObjectMapper_Java_Spring_Spring Boot_Jackson_Spring Data Rest - Fatal编程技术网

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

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

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

@Configuration
public class JacksonConfig{
    @Bean
    public Jackson2ObjectMapperBuilder objectMapperBuilder(){
        Jackson2ObjectMapperBuilder builder = new     Jackson2ObjectMapperBuilder();
        builder.failOnUnknownProperties(true);
        return builder;
    }
}
当我使用injected
ObjectMapper
时,验证工作正常,它在传递无效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);
        }
    }
}