2013-12-13 43 views
11

我與新的Spring 4.0試驗@RestController返回來自控制器的簡單文本響應:春天@RestController不返回純文本響應

@RestController 
@RequestMapping(value = "/heartbeat") 
public class HeartbeatController { 

    private static final Logger logger = LoggerFactory.getLogger(HeartbeatController.class); 

    @RequestMapping 
    public String heartbeat() { 
     logger.info("Received heartbeat!"); 
     return "I'm Alive!"; 
    } 

    @RequestMapping(value = "/test", produces = MediaType.TEXT_PLAIN_VALUE) 
    public String heartbeat2() { 
     logger.info("Received heartbeat!"); 
     return "I'm Alive!"; 
    } 
} 

當我訪問/心跳,然後我回去:

"I'm Alive!" 

結果包括雙引號,我沒有想到。

當我訪問/心跳/測試,然後我得到一個空迴應,但我期待我活着!文本。

UPDATE

捲曲-i http://myserver.com/rest/heartbeat

HTTP/1.1 200 OK 內容類型:應用/ JSON;字符集= UTF-8 服務器:開發/ 1.0 日期:星期二,17 2013年12月18時59分08秒GMT 緩存控制:無緩存過期 :週五,1990年1月1日00:00:00 GMT 的Content-Length: 「我還活着」 12

捲曲-i -H 「接受:應用/ JSON」 http://myserver.com/rest/heartbeat HTTP/1.1 200 OK 內容類型:應用/ JSON;字符集= UTF-8 服務器:開發/ 1.0 日期:星期二,12月17日2013 GMT 19點01分12秒 緩存控制:無緩存過期 :週五,1990年1月1日00:00:00 GMT 的Content-Length: 「我還活着」 12

捲曲-i http://myserver.com/rest/heartbeat/test

HTTP/1.1 406不接受 服務器:開發/ 1.0 日期:星期二,2013年12月17日十九時00分13秒GMT 緩存控制:無緩存過期 :星期五,1990年01一月00:00:00 GMT 的Content-Length:0

捲曲-i -H 「接受:text/plain的」 http://myserver.com/rest/heartbeat/test

HTTP/1.1 406不接受 服務器:DEVELOPME NT/1.0 日期:星期二,2013年12月17日19時02分06秒GMT 緩存控制:無緩存 到期日:星期五,1990年1月1日00:00:00 GMT 的Content-Length:0

+2

你在做這個瀏覽器還是來自其他HTTP客戶端? –

+1

我對Spring 4並不熟悉,但是你不需要'@ ResponseBody'嗎?我只是好奇。 –

+0

使用chrome調試器或者firebug發佈完整的HTTP響應,所以我們可以看到返回代碼等。 –

回答

4

@ RestController是一種便利的註釋,意味着您不再需要在方法上指定@ResponseBody註釋。

但是這意味着您的響應類型默認爲JSON,因此需要使用引號將其正確形成。

+2

你的意思是@RestController只支持JSON響應?當我添加產品= MediaType.TEXT_PLAIN_VALUE時,我得到了一個406. –

+1

你的捲曲反應很好奇,我沒有能夠在這裏複製這些。 heartBeat2()僅在請求頭與生產者衝突時才提供406。對於引號,你可以在你的類路徑和/或JSON消息轉換器註冊傑克遜? – englishteeth

1

@RestController在您的控制器類上合併了@Controller@ResponseBody,作爲stated in the documentation

當您使用@ResponseBody註釋方法/控制器時,Spring會在您的註釋中使用Accept HTTP請求標頭和produces屬性協助您進行內容協商。

你的情況:

  • 你得到你的心跳行動的application/json迴應,因爲你的HTTP客戶端可能會要求該Content-Type和春天做了內容協商。
  • 由於內容協商失敗,您將獲得用於hearbeat2操作的HTTP 406。您在控制器上指定text/plain作爲產品內容類型,而您的HTTP客戶端可能在其Accept請求標頭中僅列出application/json

更新:我使用了完全相同的捲曲請求,但沒有得到相同的結果。也許過濾器或HTTP代理緩存正在修改HTTP頭?

默認格式爲text/plain:

➜ curl -v http://localhost:8080/heartbeat 
> GET /heartbeat HTTP/1.1 
> User-Agent: curl/7.30.0 
> Host: localhost:8080 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Server: Apache-Coyote/1.1 
< Content-Type: text/plain;charset=ISO-8859-1 
< Content-Length: 13 
< Date: Wed, 18 Dec 2013 13:34:12 GMT 
< 
Hello, World!% 

並配有produces text/plain屬性:

➜ curl -H "Accept: text/plain" -v http://localhost:8080/heartbeat/test 
> GET /heartbeat/test HTTP/1.1 
> User-Agent: curl/7.30.0 
> Host: localhost:8080 
> Accept: text/plain 
> 
< HTTP/1.1 200 OK 
< Server: Apache-Coyote/1.1 
< Content-Type: text/plain 
< Content-Length: 13 
< Date: Wed, 18 Dec 2013 13:39:07 GMT 
< 
Hello, World!% 

This sample application做同樣的事情,並取得了良好的效果。

+0

嗨,布萊恩,謝謝你的回答。看到我的示例請求和響應。我認爲第一個/心跳示例添加引號將其轉換爲json ...我不明白爲什麼對於心跳/測試,我得到406 ... –

+0

用新的捲曲測試更新了我的答案。當刪除'@ RestController'並在方法中添加'@ ResponseBody'時,你有類似的結果嗎? –

+0

感謝您的廣泛答案,非常感謝。發現我錯過了StringHttpMessageConverter。 –

14

我發現我在我的WebConfig的configureMessageConverters中缺少StringHttpMessageConverter。 我正在配置消息轉換器來控制Jackson ObjectMapper。

@Override 
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); 
    mappingJackson2HttpMessageConverter.setPrettyPrint(SystemProperty.environment.value() == Development); 
    mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper()); 
    converters.add(mappingJackson2HttpMessageConverter); 
    converters.add(new StringHttpMessageConverter()); // THIS WAS MISSING 
} 
+0

這個問題可能會讓你感興趣,然後[SPR-11040](https://jira.springsource.org/browse/SPR-11040) –

+0

謝謝你添加這個,正是我需要的。 – arcdegree

0

此解決方案適用於我。請檢查以下內容。

  1. 確保您的DTO是可序列化,具有序列化字段,getter和setter
  2. 檢查傑克遜的依賴關係。你應該有
    • com.fasterxml.jackson.core:傑克遜核心:2.4.1
    • com.fasterxml.jackson.core:傑克遜 - 數據綁定:2.4.1
    • com.fasterxml.jackson.core :傑克遜 - 註解:2.4.1
    • com.fasterxml.jackson.datatype:傑克遜 - 數據類型 - 約達:2.4.1
    • com.fasterxml.jackson.datatype:傑克遜 - 數據類型-jsr310:2.4。1
  3. 修復RequesMapping譯註:

    @RequestMapping(value = "/test", consumes = "*/*")

  4. 檢查你有<mvc:annotation-driven />指令

0

這個工作對我來說:

  1. 在行家

    com.fasterxml.jackson.core 傑克遜,數據綁定添加此 2.4.4

  2. 確保<mvc:annotation-driven />在春天配置