2014-03-28 3 views
2

를 사용하여 I는 클래스 정의 :@JsonRootName/UnrecognizedPropertyException :로 인식 할 수없는 필드 .../자바 기반 구성

: 내 응용 프로그램에서 새 ComponentBean을 만들려고에, 자바로 구성

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 
... other config not shown for brevity 

    @Override 
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> pArgumentResolvers) { 
    pArgumentResolvers.add(this.getCurrentUserHandlerMethodArgumentResolver()); 
} 

    @Bean 
public ObjectMapper getJackson2ObjectMapperFactoryBean() { 
    final Jackson2ObjectMapperFactoryBean mapper = new Jackson2ObjectMapperFactoryBean(); 

    mapper.setIndentOutput(true); 
    mapper.setSimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 

    mapper.setFeaturesToEnable(DeserializationFeature.UNWRAP_ROOT_VALUE); 
    mapper.setFeaturesToDisable(SerializationFeature.INDENT_OUTPUT); 
    mapper.setFeaturesToEnable(SerializationFeature.WRAP_ROOT_VALUE); 

    final Map<Class<?>, JsonDeserializer<?>> deserializers = new HashMap<Class<?>, JsonDeserializer<?>>(); 
    deserializers.put(...) // customer deserializers -- ComponentBean is not one of them 

    mapper.setDeserializersByType(deserializers); 
    mapper.afterPropertiesSet(); 

    final ObjectMapper objectMapper = mapper.getObject(); 
    objectMapper.registerModule(new JodaModule()); // register custom joda time serializer 

    return objectMapper; 
} 

@Bean 
public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() { 
    final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
    converter.setObjectMapper(this.getJackson2ObjectMapperFactoryBean()); 

    return converter; 
} 

나는 예외를받을

이제는 이전에 XML 기반 구성을 사용하여 구성한 방식으로 작동하지만 Java 기반 구성을 사용하도록 전환했습니다.이 구성은 내가 얻을 수없는 유일한 구성 요소 인 것으로 보입니다. 올바르게 작동.

XML 기반의 설정은 이것이다 :

<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
     <bean class="com.aoins.sales.user.CurrentUserHandlerMethodArgumentResolver" /> 
    </mvc:argument-resolvers> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper" ref="objectMapper" /> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" 
    p:indentOutput="true" p:simpleDateFormat="MM/dd/yyyy HH:mm:ss"> 
    <property name="featuresToEnable"> 
     <array> 
      <util:constant static-field="com.fasterxml.jackson.databind.DeserializationFeature.UNWRAP_ROOT_VALUE" /> 
     </array> 
    </property> 
    <property name="featuresToDisable"> 
     <array> 
      <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT" /> 
     </array> 
    </property> 
    <!-- Add deserializers that require autowiring --> 
    <property name="deserializersByType"> 
     <map key-type="java.lang.Class"> 
      <entry key="..."> 
       <bean class="..." /> 
      </entry> 
     </map> 
    </property> 
</bean> 

내 질문은 이것을 자바 기반 구성 제대로 작동하게하는 방법이다. 봄에 json 루트를 인식하기위한 주석이 누락 되었습니까? 내 ObjectMapper, 추가 설정에 추가해야 할 또 다른 주석이 있습니까? 아니면 ComponentBean에 대한 사용자 정의 직 병렬 변환기를 만들 필요가 있습니까? @JsonRootName을 사용하면을 사용해야하므로 ComponentBean에 대한 사용자 지정 직렬화기를 만드는 것을 피하려고합니다. 작업)?

몇 가지 유의할 점은 모든 속성을 사용해야하기 때문에 이러한 속성을 무시하고 싶지는 않습니다.

답변

1

알아 냈어. 내 메시지를 해결하기 위해 오버라이드해야했던 WeMvcConfigurer가 제공 한 방법이 있었지만, 내 의도가 아닌 기본 리졸버가 사용되었습니다. 원래 XML을 보면 우리는 다음을 참조하십시오

<mvc:message-converters> 
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
     <property name="objectMapper" ref="objectMapper" /> 
    </bean> 
</mvc:message-converters> 

내가 올바르게 콩으로 MappingJackson2HttpMessageConverter을 구성하지만, XML은 그것에 추가 있었는지에 충분히주의를 지불하지 않았다; 메시지 변환기. 내 Java 기반 구성에 다음을 추가하면 문제가 해결됩니다.

@Override 
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    converters.add(this.getMappingJackson2HttpMessageConverter()); 
} 

다른 사람에게 도움이 되었으면 좋겠지 만, 내 편에서는 간과 한 내용이었습니다. 나는 이것이 당신이 항상 Spring을 가지고 기억해야만하는 것 중 하나라고 생각합니다, 그들은 오래된 많은 상용구 코드들을 제거하고 이번에는 나를 때리게했습니다.

관련 문제