이 문제는 저를 화나게했습니다 : Spring은 매우 강력한 도구이지만 JSON과 같은 출력 문자열을 작성하는 것과 같은 간단한 일은 추악한 해킹없이 불가능 해 보입니다.
가장 방해가 적고 가장 투명한 솔루션은 컨트롤러 조언을 사용하고 요청이 특정 엔드 포인트 세트로 갔는지 여부를 확인하는 것입니다 (REST API는 일반적으로 여기에서 모든 답변을 JSON으로 가장 자주 반환하기를 원하기 때문에) 반환 된 데이터가 일반 문자열 ( "JSON deserialization을 수행하지 마십시오!") 또는 다른 항목 ( "JSON deserialization을 수행하십시오!")인지 여부에 따라 프론트 엔드에서 전문화하지 마십시오. 이것의 긍정적 인 측면은 컨트롤러가 해킹없이 동일하게 유지된다는 것입니다.
이 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
출력에 사용해야 할 간단한 주석을 얻을 수 있기를 바랍니다 .