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
@JsonIgnoreProperties(ignoreUnknown=false)在Spring4.2.0及更高版本中不起作用_Spring_Spring Mvc_Jackson2_Jackson Dataformat Xml - Fatal编程技术网

@JsonIgnoreProperties(ignoreUnknown=false)在Spring4.2.0及更高版本中不起作用

@JsonIgnoreProperties(ignoreUnknown=false)在Spring4.2.0及更高版本中不起作用,spring,spring-mvc,jackson2,jackson-dataformat-xml,Spring,Spring Mvc,Jackson2,Jackson Dataformat Xml,@JsonIgnoreProperties(ignoreUnknown=false)不适用于Spring4.2.0和spring的更高版本。但它正在使用4.0.4和4.0.1。 我使用的是spring 4.2.8,使用的是Jackson依赖项 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</arti

@JsonIgnoreProperties(ignoreUnknown=false)不适用于Spring4.2.0和spring的更高版本。但它正在使用4.0.4和4.0.1。 我使用的是spring 4.2.8,使用的是Jackson依赖项

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.6.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.6.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.6.3</version>
</dependency>
如果发送有效的对应json请求,它应该如下

{ 
   "id": "123", 
   "name": "test" 
}
但是,即使我发送了json请求,其中包含如下无效字段,它仍然可以接受

{ 
    "id": "123", 
    "name": "test", 
    "anyinvalidkey": "test" 
}

但是它应该给出错误的请求作为响应

这是因为spring早期版本提供的
HttpMessageConverter
使用了
ObjectMapper
默认配置。但较新版本的spring使用的是具有反序列化功能的
Jackson2ObjectMapperBulider
。默认情况下,属性设置为false的未知属性失败。(参考)。您可以通过在applicationContext.xml中添加以下内容来解决此问题:

<bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" />

<mvc:annotation-driven
    content-negotiation-manager="contentNegotiationManager">
    <mvc:message-converters>
        <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="jacksonObjectMapper" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
<bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
    <property name="mediaTypes">
        <value>
            json=application/json
        </value>
    </property>
</bean>

json=应用程序/json

基于Aarya答案的基于注释的解决方案可以通过以下方式完成:

@Configuration
public class Config implements InitializingBean {

    @Autowired
    private RequestMappingHandlerAdapter converter;

    @Override
    public void afterPropertiesSet() throws Exception {
        configureJacksonToFailOnUnknownProperties();
    }

    private void configureJacksonToFailOnUnknownProperties() {
        MappingJackson2HttpMessageConverter httpMessageConverter = converter.getMessageConverters().stream()
                .filter(mc -> mc.getClass().equals(MappingJackson2HttpMessageConverter.class))
                .map(mc -> (MappingJackson2HttpMessageConverter)mc)
                .findFirst()
                .get();

        httpMessageConverter.getObjectMapper().enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    }
}

@Aarya的回答对我来说并不适用,但给了我一个很好的提示,让我四处看看。所以这对我来说是有效的。考虑到我的Spring是4.3.12版本,jackson是2.9.2版本

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                    <bean class="com.fasterxml.jackson.databind.ObjectMapper" />
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

简易注释驱动解决方案。在@配置中:

@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
    return objectMapper;
}

如何使用Spring Boot实现这一点?难道没有一个注释可以切换此功能而不是复制粘贴此配置吗?
@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
    return objectMapper;
}