2014-10-10 64 views
1

如果我用下面的配置,然後傑克遜轉換器作品(MVC聲明是最後一次)傑克遜轉換器和使用javax驗證(註釋)不能一起工作

<!-- Configure to plugin JSON as request and response in method handler --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonMessageConverter"/> 
     </list> 
    </property> 
</bean> 

<!-- Configure bean to convert JSON to POJO and vice versa --> 
<bean id="jsonMessageConverter"  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
</bean> 
<context:component-scan base-package="com.base" /> 
<mvc:annotation-driven /> 

如果我在dispatcher.xml使用此配置,然後驗證工作,但轉換不。 (mvc申報第一)

<context:component-scan base-package="com.base" /> 

<mvc:annotation-driven /> 

<!-- Configure to plugin JSON as request and response in method handler --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonMessageConverter"/> 
     </list> 
    </property> 
</bean> 

<!-- Configure bean to convert JSON to POJO and vice versa --> 
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
</bean> 

任何幫助非常感謝。 Spring版本4.0.6

回答

0

我選擇了驗證工作的部分並將其添加到代碼庫中。

@RequestMapping(value = "url", method = RequestMethod.GET) 
protected void getLocationAsJson(@PathVariable("id") Integer id, 
@RequestParam("cid") Integer cid, HttpServletResponse response) { 
    MappingJacksonHttpMessageConverter jsonConverter = 
      new MappingJacksonHttpMessageConverter(); 
    Location loc= new Location(id); 
    MediaType jsonMimeType = MediaType.APPLICATION_JSON; 
    if (jsonConverter.canWrite(requestedLocation.getClass(), jsonMimeType)) { 
    try { 
     jsonConverter.write(requestedLocation, jsonMimeType, 
           new ServletServerHttpResponse(response)); 
     } catch (IOException m_Ioe) { 
      // TODO: announce this exception somehow 
     } catch (HttpMessageNotWritableException p_Nwe) { 
      // TODO: announce this exception somehow 
     } 
    } 
} 

現在驗證工作以及JSON返回。 該方法沒有返回任何東西。

0

RequestMappingHandlerAdapter的xml配置有點複雜。這個配置的問題是,它刪除了轉換器的彈簧默認配置。最好使用此配置的編碼版本。 Spring的默認配置將以這種方式完好無損。這裏是示例配置。

建議的解決方案,張貼在許多博客。但不適合我的情況。

https://dzone.com/articles/customizing http://www.java-allandsundry.com/2014/09/customizing-httpmessageconverters-with.html

@Configuration 
public class MessageConvertorConfiguration extends WebMvcConfigurationSupport { 
    @Bean 
    public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() { 
     MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); 
     ObjectMapper objectMapper = new ObjectMapper(); 
     Custom360DateFormat dateFormat = new Custom360DateFormat(); 
     dateFormat.setDateFormat(new SimpleDateFormat("MM/dd/yyyy")); 
     dateFormat.setDateTimeFormat(new SimpleDateFormat("MM/dd/yyyy hh:mm a")); 

     objectMapper.setDateFormat(dateFormat); 
     objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     jsonConverter.setObjectMapper(objectMapper); 
     return jsonConverter; 
    } 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(customJackson2HttpMessageConverter()); 
     super.addDefaultHttpMessageConverters(converters); 
    } 
} 

工作液

@Configuration 
public class MessageConvertorConfiguration { 

    private MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() { 
     MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); 
     ObjectMapper objectMapper = new ObjectMapper(); 
     Custom360DateFormat dateFormat = new Custom360DateFormat(); 
     dateFormat.setDateFormat(new SimpleDateFormat("MM/dd/yyyy")); 
     dateFormat.setDateTimeFormat(new SimpleDateFormat("MM/dd/yyyy hh:mm a")); 

     objectMapper.setDateFormat(dateFormat); 
     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
     objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     jsonConverter.setObjectMapper(objectMapper); 
     return jsonConverter; 
    } 

    @Autowired 
public void updateJacksonConvertor(RequestMappingHandlerAdapter handlerAdapter) { 

    //remove default jakson convertor 
    Iterator<HttpMessageConverter<?>> convertorsIterator = handlerAdapter.getMessageConverters().iterator(); 
    while (convertorsIterator.hasNext()) { 
     HttpMessageConverter converter = convertorsIterator.next(); 
     if(converter instanceof AbstractJackson2HttpMessageConverter) { 
      convertorsIterator.remove(); 
     } 
    } 

    handlerAdapter.getMessageConverters().add(customJackson2HttpMessageConverter()); 
} 

}