[java] Spring MVC-Rest Controller에서 간단한 문자열을 JSON으로 반환하는 방법

내 질문은 본질적 으로이 질문에 대한 후속 조치 입니다.

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

위에서 스프링은 응답 본문에 “Hello World”를 추가 할 것이다. JSON 응답으로 문자열을 어떻게 반환합니까? 나는 따옴표를 추가 할 수 있지만 더 해킹처럼 느껴진다는 것을 이해합니다.

이 개념을 설명하는 데 도움이되는 예를 제공하십시오.

참고 : HTTP 응답 본문에 직접 작성하고 싶지는 않습니다. 문자열을 JSON 형식으로 반환하고 싶습니다 ( 응답이 유효한 JSON 형식 이어야 하는 RestyGWT 와 함께 Controller를 사용 하고 있습니다).



답변

반환 text/plain( Spring MVC 3 Controller에서 문자열 메시지 만 반환 에서와 같이 ) 또는 문자열을 객체로 감싸십시오.

public class StringResponse {

    private String response;

    public StringResponse(String s) {
       this.response = s;
    }

    // get/set omitted...
}

응답 유형을 MediaType.APPLICATION_JSON_VALUE(= "application/json")으로 설정하십시오.

@RequestMapping(value = "/getString", method = RequestMethod.GET,
                produces = MediaType.APPLICATION_JSON_VALUE)

그리고 당신은 JSON처럼 보입니다

{  "response" : "your string value" }


답변

JSON은 본질적으로 PHP 또는 JAVA 컨텍스트의 문자열입니다. 즉, 유효한 JSON 인 문자열을 응답으로 반환 할 수 있습니다. 다음과 같이 작동합니다.

  @RequestMapping(value="/user/addUser", method=RequestMethod.POST)
  @ResponseBody
  public String addUser(@ModelAttribute("user") User user) {

    if (user != null) {
      logger.info("Inside addIssuer, adding: " + user.toString());
    } else {
      logger.info("Inside addIssuer...");
    }
    users.put(user.getUsername(), user);
    return "{\"success\":1}";
  }

간단한 문자열 응답에는 괜찮습니다. 그러나 복잡한 JSON 응답의 경우 Shaun에서 설명한대로 래퍼 클래스를 사용해야합니다.


답변

한 프로젝트에서 JSONObject (maven dependency info )를 사용 하여이 문제를 해결했습니다 . 우리는 래퍼 객체가 아닌 간단한 문자열을 반환하는 것을 선호했기 때문에 이것을 선택했습니다. 새 종속성을 추가하지 않으려는 경우 내부 도우미 클래스를 대신 쉽게 사용할 수 있습니다.

사용법 예 :

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


답변

당신은 쉽게 반환 할 수 JSONString속성에 response다음과 같은

@RestController
public class TestController {
    @RequestMapping(value = "/getString", produces = MediaType.APPLICATION_JSON_VALUE)
    public Map getString() {
        return Collections.singletonMap("response", "Hello World");
    }
}


답변

기본 StringHttpMessageConverter인스턴스를 등록 취소하면됩니다 .

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
  /**
   * Unregister the default {@link StringHttpMessageConverter} as we want Strings
   * to be handled by the JSON converter.
   *
   * @param converters List of already configured converters
   * @see WebMvcConfigurationSupport#addDefaultHttpMessageConverters(List)
   */
  @Override
  protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.stream()
      .filter(c -> c instanceof StringHttpMessageConverter)
      .findFirst().ifPresent(converters::remove);
  }
}

컨트롤러 액션 핸들러 메소드와 컨트롤러 예외 핸들러로 테스트했습니다.

@RequestMapping("/foo")
public String produceFoo() {
  return "foo";
}

@ExceptionHandler(FooApiException.class)
public String fooException(HttpServletRequest request, Throwable e) {
  return e.getMessage();
}

최종 메모 :

  • extendMessageConvertersSpring 4.1.3부터 ​​사용할 수 있습니다. 이전 버전에서 실행중인 경우을 사용하여 동일한 기술을 구현할 수 있습니다 configureMessageConverters. 조금 더 많은 작업이 필요합니다.
  • 응용 프로그램이 JSON 만 반환하고 다른 콘텐츠 유형은 반환하지 않는 경우 이것은 가능한 많은 다른 방법 중 하나입니다. 기본 변환기를 건너 뛰고 단일 잭슨 변환기를 추가하는 것이 좋습니다. 다른 방법은 기본 변환기를 추가하지만 다른 순서로 잭슨 변환기가 문자열 변환기보다 먼저 오도록하는 것입니다. 이를 통해 컨트롤러 조치 메소드가 응답의 매체 유형에 따라 문자열을 변환 할 방법을 지정할 수 있습니다.

답변

나는이 질문이 오래되었다는 것을 알고 있지만 나도 기여하고 싶다 :

다른 응답의 주요 차이점은 해시 맵 리턴입니다.

@GetMapping("...")
@ResponseBody
public Map<String, Object> endPointExample(...) {

    Map<String, Object> rtn = new LinkedHashMap<>();

    rtn.put("pic", image);
    rtn.put("potato", "King Potato");

    return rtn;

}

이것은 다음을 반환합니다 :

{"pic":"a17fefab83517fb...beb8ac5a2ae8f0449","potato":"King Potato"}


답변

간단하게 :

    @GetMapping("/health")
    public ResponseEntity<String> healthCheck() {
        LOG.info("REST request health check");
        return new ResponseEntity<>("{\"status\" : \"UP\"}", HttpStatus.OK);
    }