5

@JsonIgnoreProperties(ignoreUnknown=false) 不适用于 spring 4.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 请求,那么它将作为有效请求接受。但它应该给出错误的请求作为响应。例如:如果我有课

public class Student{ 
    private String id; 
    private String name; 
}

如果发送有效的相应 json 请求应该是这样的

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

但即使我发送带有无效字段的 json 请求,如下所示,它仍然可以接受。

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

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

4

4 回答 4

4

基于 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);
    }
}
于 2017-10-02T10:52:14.340 回答
2

简单的注释驱动解决方案。在@Configuration 中:

@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
    return objectMapper;
}
于 2017-12-26T23:45:09.250 回答
0

@Aarya 的回答对我来说并没有开箱即用,但给了我一个很好的提示让我环顾四周。所以这对我有用。鉴于我的 Spring 是 4.3.12.RELEASE 而杰克逊是 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>
于 2017-11-10T19:18:09.207 回答
0

发生这种情况是因为HttpMessageConverter早期版本的 spring 提供的使用ObjectMapper默认配置。但是较新版本的 spring 使用默认设置为 false 的属性Jackson2ObjectMapperBuliderDeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES(参考链接)。您可以通过在 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>
于 2017-01-16T09:35:20.370 回答