2

私は Jetty8 を使用しています。jetty の servletResponse 実装は org.eclipse.jetty.server.Response で、デフォルトの ContentType は "text/html;UTF-8" です。

私のリクエストマッピング方法:

@RequestMapping(value = "/post1", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public NodeConfig post1(@RequestBody NodeConfig config) {
    return config;
}

AGSONHttpMessageConverterは戻り値を処理しますconfig

GSONHttpMessageConverter extends
        AbstractHttpMessageConverter<Object>

私は見ますAbstractHttpMessageConverter.write(xxx)

HttpHeaders headers = outputMessage.getHeaders();
//...
headers.setContentType(contentType);

"application/json" は response.headers に設定されましたが、response.contentType には設定されませんでした。チェックServletServerHttpResponse.writeHeaders(xxx):

if (this.servletResponse.getContentType() == null && this.headers.getContentType() != null) {
                this.servletResponse.setContentType(this.headers.getContentType().toString());
            }

のデフォルトの contentType のservletResponseため、実際の contentType はthis.headersresponse に設定されていません。

誰もこの問題に遭遇しますか? contentType を servletResponse に設定するアイデアはありますか? (ビジネスメソッドに servletResponse を注入するのは好きではありません)

次のコードを追加しAbstractHttpMessageConverter.write(xx)て回避します。

    if (contentType != null && (outputMessage instanceof ServletServerHttpResponse)) {
        ServletServerHttpResponse response = (ServletServerHttpResponse) outputMessage;
        response.getServletResponse().setContentType(contentType.toString());
   }
4

0 に答える 0