この問題は私を怒らせました:Springは非常に強力なツールですが、JSONとして出力文字列を書き込むという単純なことは、醜いハックなしでは不可能に思えます。
最も煩わしくなく、最も透過的であると私が思う私の解決策(Kotlinで)は、コントローラーのアドバイスを使用して、リクエストが特定のエンドポイントのセット(REST API)に送信されたかどうかを確認することです(REST APIは通常、ここからすべての回答をJSONとして返したいためです)返されたデータがプレーン文字列(「JSON逆シリアル化を行わないでください!」)か、それ以外(「JSON逆シリアル化を実行!」)かどうかに基づいて、フロントエンドで特殊化を行わないでください。これの良い面は、コントローラーが同じままで、ハックなしであるということです。
supports
この方法は、によって処理されたすべての要求ことを確認しStringHttpMessageConverter
て処理されている(ハンドルプレーン文字列を返すすべてのコントローラの出力があることなどコンバータ)とではbeforeBodyWrite
方法は、我々は中断し、JSONへの出力を変換したい場合には制御します(それに応じてヘッダーを変更します)。
@ControllerAdvice
class StringToJsonAdvice(val ob: ObjectMapper) : ResponseBodyAdvice<Any?> {
override fun supports(returnType: MethodParameter, converterType: Class<out HttpMessageConverter<*>>): Boolean =
converterType === StringHttpMessageConverter::class.java
override fun beforeBodyWrite(
body: Any?,
returnType: MethodParameter,
selectedContentType: MediaType,
selectedConverterType: Class<out HttpMessageConverter<*>>,
request: ServerHttpRequest,
response: ServerHttpResponse
): Any? {
return if (request.uri.path.contains("api")) {
response.getHeaders().contentType = MediaType.APPLICATION_JSON
ob.writeValueAsString(body)
} else body
}
}
将来的にはHttpMessageConverter
、出力に使用する必要があるものをオーバーライドできる簡単な注釈が得られることを願っています。