복붙노트

[SPRING] Spring Rest Controller의 JSON 반환 값으로 사용되는 간단한 문자열

SPRING

Spring Rest Controller의 JSON 반환 값으로 사용되는 간단한 문자열

다음의 간단한 테스트 컨트롤러 (Spring 4.0.3에서 사용됨)를 살펴 보자 :

@RestController
public class TestController
{
    @RequestMapping("/getList")
    public List<String> getList()
    {
        final List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        return list;
    }

    @RequestMapping("/getString")
    public String getString()
    {
        return "Hello World";
    }
}

이론적으로 두 컨트롤러 메소드 모두 유효한 JSON을 반환해야합니다. 실제로 첫 번째 컨트롤러 메서드를 호출하면 다음 JSON 배열이 반환됩니다.

$ curl -i -H "Accept: application/json" http://localhost:8080/getList
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

["1","2"]

그러나 두 번째 컨트롤러 메서드는 유효한 JSON 문자열이 아닌 따옴표없이 문자열을 반환합니다.

$ curl -i -H "Accept: application/json" http://localhost:8080/getString
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

Hello World

왜 이렇게이다? 그것을 구성 할 수 있습니까? 그게 버그 야? 아니면 이해할 수없는 기능입니까?

해결법

  1. ==============================

    1.String 객체를 반환하면 Spring MVC는 이것을 응답 본문에 넣을 내용으로 해석하고 더 이상 수정하지 않습니다. 실제 문자열을 JSON 응답으로 사용하려면 직접 인용하거나 잭슨을 통해 명시 적으로 실행해야합니다.

    String 객체를 반환하면 Spring MVC는 이것을 응답 본문에 넣을 내용으로 해석하고 더 이상 수정하지 않습니다. 실제 문자열을 JSON 응답으로 사용하려면 직접 인용하거나 잭슨을 통해 명시 적으로 실행해야합니다.

  2. ==============================

    2.주석에서 언급 한 것처럼 Jackson 변환기 앞에 등록 된 StringHttpMessageConverter를 제거 할 수 있습니다.

    주석에서 언급 한 것처럼 Jackson 변환기 앞에 등록 된 StringHttpMessageConverter를 제거 할 수 있습니다.

    /**
     * Unregister the default {@link StringHttpMessageConverter} as we want
     * Strings to be handled by the JSON converter.
     *
     * Our MappingJackson2HttpMessageConverter will deal with strings.
     *
     * @param converters
     *            List of already configured converters
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);
    }
    
  3. ==============================

    3.String 객체를 반환하기를 원한다면 Spring MVC는 그 내용을 응답 본문에 넣을 내용으로 해석하고 더 이상 수정하지 않는다. 실제 문자열을 JSON 응답으로 사용하려면 직접 인용하거나 잭슨을 통해 명시 적으로 실행해야합니다.

    String 객체를 반환하기를 원한다면 Spring MVC는 그 내용을 응답 본문에 넣을 내용으로 해석하고 더 이상 수정하지 않는다. 실제 문자열을 JSON 응답으로 사용하려면 직접 인용하거나 잭슨을 통해 명시 적으로 실행해야합니다.

    @RestController
    public class TestController
    {
       @RequestMapping("/getString")
       public String getString()
      {
        return JSONObject.quote("Hello World");
      }
    }
    
  4. ==============================

    4.다음은이 작업을 수행하기위한 단계입니다.

    다음은이 작업을 수행하기위한 단계입니다.

  5. from https://stackoverflow.com/questions/23581619/simple-string-as-json-return-value-in-spring-rest-controller by cc-by-sa and MIT license