2015-11-01 20 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,這些方法調用的很好。