2016-12-13 22 views
1

@JsonIgnoreProperties(ignoreUnknown = false)は、Spring 4.2.0以降のバージョンで動作しません。しかし4.0.4と4.0.1で動作しています。 私は春4.2.8を使用していますが、私はそれが有効な要求として受け入れている、無効なフィールドを持つJSONリクエストを送信する場合は、ジャクソンの依存関係が@JsonIgnoreProperties(ignoreUnknown = false)は、Spring 4.2.0以降のバージョンでは機能しません。

<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リクエストを送信しても要求した場合、私はクラス

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

を持っている場合。

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

しかし、それは春の以前のバージョンで提供さHttpMessageConverterObjectMapperデフォルトの設定を使用していたので、これが起こっている応答

+0

誰もがこの問題について考えていますか?親切に解決を助言する。 – Masbha

答えて

0

として不正な要求を与える必要があります。しかし、新しいバージョンのスプリングは、のデフォルトではDeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIESプロパティがfalseに設定されています。 (参照番号link)。あなたの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> 
1

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

をAaryaさん@答えはすぐに私のために働かなかったが、私に周りを見回すための大きなヒントを与えた。これは私のために働くものです。私の春は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> 
0

簡単に注釈駆動型ソリューションです。 @Configuration:

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