2015-11-01 21 views
0

我试图将我的Spring应用程序配置为根据用户请求的介质类型返回JSON或CSV。为了做到这一点我已成立了自己的广告代码像下面使用消息转换器从Spring控制器返回CSV或JSON

<context:annotation-config /> 


<bean id ="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="false"/> 
    <property name="favorParameter" value="true"/> 
    <property name="parameterName" value="mediaType"/> 
    <property name="defaultContentType" value="test/csv"/> 

    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json" /> 
      <entry key="csv" value="test/csv"/> 
     </map> 
    </property> 
</bean> 

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"> 
    <mvc:message-converters register-defaults="true"> 
     <bean class="com.data.api.util.CSVMessageConverter"/> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper"> 
       <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> 
        <property name="modules" ref="jodaModule"/> 
        <property name="featuresToDisable"> 
         <array> 
          <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS"/> 
         </array> 
        </property> 
        <property name="defaultViewInclusion" value="false"/> 
        <property name="failOnUnknownProperties" value="false"/> 
       </bean> 

      </property> 
      <property name="supportedMediaTypes"> 
       <array> 
        <util:constant static-field="org.springframework.http.MediaType.ALL" /> 
       </array> 

      </property> 
     </bean> 
<bean id="jodaModule" class="com.fasterxml.jackson.datatype.joda.JodaModule"/> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

下面是我CSVMessageConverter类

公共类CSVMessageConverter扩展AbstractHttpMessageConverter {

public static final MediaType MEDIA_TYPE = new MediaType("text", "csv", Charset.forName("utf-8")); 

public CSVMessageConverter() { 
    super(MEDIA_TYPE); 
} 

@Override 
protected boolean supports(Class<?> clazz) { 
    return true; 
} 

@Override 
protected CSVMessage readInternal(Class<? extends CSVMessage> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
    CSVReader reader = new CSVReader(new InputStreamReader(inputMessage.getBody())); 
    return new CSVMessage(reader.readAll()); 
} 

@Override 
protected void writeInternal(CSVMessage message, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 
    CSVWriter writer = new CSVWriter(new OutputStreamWriter(outputMessage.getBody())); 
    if (! Strings.isNullOrEmpty(message.getHeader())) { 
     writer.writeNext(new String[] { "#" + message.getHeader() }); 
    } 
    for (String[] row: message.getRows()) { 
     writer.writeNext(row); 
    } 
    writer.close(); 
} 

}

和我的控制器这是否

public class TestController { 
public @ResponseBody List<Records> getHits(@PathVariable("domain") name domainName, 
             @PathVariable("property") Name propertyName, 
             @RequestParam(value = "start", required = true) @DateTimeFormat(pattern = datePattern) Date startDate, 
             @RequestParam(value = "end", required = true) @DateTimeFormat(pattern = datePattern) Date endDate, 
             HttpServletRequest request) { 
//This returns an arralist of records 
}  
} 

我无法让我的CSVMessageConverter工作。它抛出不能投射ArrayList到CSVMessage。我究竟做错了什么 ?它与JSON正常工作,但如果我请求“文本/ csv”它爆炸。

有人可以解释一下Spring如何使用MessageConverters和WhatI可以做到以上代码的工作。

回答

0

我修复了这个问题,修复了我的CSVMessageConverter类。它正在等待readInternal/WriteExternal中的CSVMessage类。我将其更改为ArrayList.class,这些方法调用的很好。