私は新しいSpring4.0 @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!";
}
}
/ heartbeatにアクセスすると、次のように戻ります。
"I'm Alive!"
結果には、私が予期していなかった二重引用符が含まれています。
/ heartbeat/testにアクセスすると、空の応答が返されますが、私は生きていると思います。テキスト。
[〜#〜]更新[〜#〜]
curl -i http://myserver.com/rest/heartbeat
HTTP/1.1 200 OKコンテンツタイプ:application/json; charset = UTF-8サーバー:開発/1.0日付:2013年12月17日火曜日18:59:08 GMTキャッシュ制御:キャッシュなし有効期限:1990年1月1日金曜日00:00:00 GMTコンテンツ-長さ:12
"私は生きている!"
curl -i -H "Accept:application/json" http://myserver.com/rest/heartbeat HTTP/1.1 200 OK Content-Type:application/json; charset = UTF-8サーバー:開発/1.0日付:2013年12月17日火曜日19:01:12 GMTキャッシュ制御:キャッシュなし有効期限:1990年1月1日金曜日00:00:00 GMTコンテンツ長:12
"私は生きている!"
curl -i http://myserver.com/rest/heartbeat/test
HTTP/1.1 406 Not Acceptable Server:Development/1.0 Date:Tue、17 Dec 2013 19:00:13 GMT Cache-Control:no-cache Expires:Fri、01 Jan 1990 00:00:00 GMT Content-Length:0
curl -i -H "Accept:text/plain" http://myserver.com/rest/heartbeat/test
HTTP/1.1 406 Not Acceptable Server:Development/1.0 Date:Tue、17 Dec 2013 19:02:06 GMT Cache-Control:no-cache Expires:Fri、01 Jan 1990 00:00:00 GMT Content-Length:0
WebConfigのconfigureMessageConvertersにStringHttpMessageConverterがないことがわかりました。 JacksonObjectMapperを制御するようにメッセージコンバーターを構成していました。
@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
}
@RestControllerは便利なアノテーションであり、メソッドで@ResponseBodyアノテーションを指定する必要がなくなったことを意味します。
ただし、応答タイプはデフォルトでJSONに設定されているため、適切に形成されるように引用符で囲まれていることを意味します。
@RestController
は、コントローラークラスで@Controller
と@ResponseBody
を ドキュメントに記載 のように組み合わせます。
メソッド/コントローラーに@ResponseBody
のアノテーションを付けると、Springは、アノテーションのAccept
HTTPリクエストヘッダーとproduces
属性を使用して、コンテンツのネゴシエーションを支援します。
あなたの場合:
application/json
応答を受け取ります。text/plain
を指定しましたが、HTTPクライアントはおそらくAccept
リクエストヘッダーにapplication/json
のみをリストします。Update:まったく同じcurlリクエストを使用しましたが、同じ結果が得られません。たぶん、フィルターまたは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!%
このサンプルアプリケーション 同じことを行い、良い結果が得られます。
この解決策は私のために働いた。以下をご確認ください。
RequesMappingアノテーションを修正します。
@RequestMapping(value = "/test", consumes = "*/*")
<mvc:annotation-driven />
ディレクティブがあることを確認してください
これは私のために働きます:
これをMavenに追加します
com.fasterxml.jackson.core jackson-databind 2.4.4
確認してください <mvc:annotation-driven />
は春に構成されます