web-dev-qa-db-ja.com

Spring @ RestControllerがプレーンテキストの応答を返さない

私は新しい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

11
Marcel Overdijk

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
}
19
Marcel Overdijk

@RestControllerは便利なアノテーションであり、メソッドで@ResponseBodyアノテーションを指定する必要がなくなったことを意味します。

ただし、応答タイプはデフォルトでJSONに設定されているため、適切に形成されるように引用符で囲まれていることを意味します。

4
englishteeth

@RestControllerは、コントローラークラスで@Controller@ResponseBodyドキュメントに記載 のように組み合わせます。

メソッド/コントローラーに@ResponseBodyのアノテーションを付けると、Springは、アノテーションのAcceptHTTPリクエストヘッダーとproduces属性を使用して、コンテンツのネゴシエーションを支援します。

あなたの場合:

  • HTTPクライアントがおそらくそのContent-Typeを要求し、Springがコンテンツネゴシエーションを行ったため、ハートビートアクションに対してapplication/json応答を受け取ります。
  • コンテンツネゴシエーションが失敗したため、hearbeat2アクションのHTTP406を取得します。コントローラでContent-Typeを生成するものとして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!%

このサンプルアプリケーション 同じことを行い、良い結果が得られます。

2
Brian Clozel

この解決策は私のために働いた。以下をご確認ください。

  1. DTOがシリアル化可能であり、シリアル化可能なフィールド、ゲッター、セッターがあることを確認してください
  2. Jacksonの依存関係を確認してください。あなたが持っている必要があります
    • com.fasterxml.jackson.core:jackson-core:2.4.1
    • com.fasterxml.jackson.core:jackson-databind:2.4.1
    • com.fasterxml.jackson.core:jackson-annotations:2.4.1
    • com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.1
    • com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.4.1
  3. RequesMappingアノテーションを修正します。

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

  4. <mvc:annotation-driven />ディレクティブがあることを確認してください

1
Fırat KÜÇÜK

これは私のために働きます:

  1. これをMavenに追加します

    com.fasterxml.jackson.core jackson-databind 2.4.4

  2. 確認してください <mvc:annotation-driven />は春に構成されます

0
cn123h