복붙노트

[SPRING] 휴식 컨트롤러에서 JSON으로 간단한 문자열을 반환하는 방법

SPRING

휴식 컨트롤러에서 JSON으로 간단한 문자열을 반환하는 방법

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

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

위의 경우 Spring은 "Hello World"를 응답 본문에 추가합니다. String을 JSON 응답으로 반환하려면 어떻게해야합니까? 따옴표를 추가 할 수 있다고 생각하지만 해킹처럼 느껴집니다.

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

해결법

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

    1.text / plain을 반환하거나 (Spring MVC 3 컨트롤러에서 문자열 메시지 만 반환) OR 문자열을 감싸는 것은 어떤 객체입니다

    text / plain을 반환하거나 (Spring MVC 3 컨트롤러에서 문자열 메시지 만 반환) OR 문자열을 감싸는 것은 어떤 객체입니다

    public class StringResponse {
    
        private String response;
    
        public StringResponse(String s) { 
           this.response = s;
        }
    
        // get/set omitted...
    }
    

    응답 유형을 application / json으로 설정하십시오.

    @RequestMapping(value = "/getString", method = RequestMethod.GET, produces = "application/json")
    

    다음과 같은 JSON이 있습니다.

    {  "response" : "your string value" }
    
  2. ==============================

    2.JSON은 본질적으로 PHP 또는 JAVA 컨텍스트의 String입니다. 즉 유효한 JSON이 응답으로 반환 될 수있는 문자열을 의미합니다. 다음은 작동해야합니다.

    JSON은 본질적으로 PHP 또는 JAVA 컨텍스트의 String입니다. 즉 유효한 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이 설명한대로 래퍼 클래스를 사용해야합니다.

  3. ==============================

    3.이 질문을 올린 이후 JSONObject (maven dependency info)를 사용하기 시작했습니다. 특히 팀과 함께 일하면서, 원하는 모든 것이 단순한 String 일 때 어떤 래퍼 객체보다는 String을 반환하는 것이 더 쉽다는 것을 알게되었습니다.

    이 질문을 올린 이후 JSONObject (maven dependency info)를 사용하기 시작했습니다. 특히 팀과 함께 일하면서, 원하는 모든 것이 단순한 String 일 때 어떤 래퍼 객체보다는 String을 반환하는 것이 더 쉽다는 것을 알게되었습니다.

    사용 예 :

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

    4.다음과 같이 속성 응답에 JSON을 문자열과 함께 쉽게 반환 할 수 있습니다.

    다음과 같이 속성 응답에 JSON을 문자열과 함께 쉽게 반환 할 수 있습니다.

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

    5.단순히 기본 StringHttpMessageConverter 인스턴스를 등록 해제하십시오.

    단순히 기본 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();
    }
    

    최종 메모 :

  6. ==============================

    6.나는이 질문이 오래되었다는 것을 알고 있지만 나는 또한 공헌하고 싶다.

    나는이 질문이 오래되었다는 것을 알고 있지만 나는 또한 공헌하고 싶다.

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

    @GetMapping("...")
    @ResponseBody
    public HashMap<String, Object> endPointExample(...) {
    
        HashMap<String, Object> rtn = new LinkedHashMap<String, Object>();
        rtn.put("pic", image);
        rtn.put("potato", "King Potato");
    
        return rtn;
    
    }
    

    그러면 다음과 같이 반환됩니다.

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

    7.produce = "application / json"을 @RequestMapping 주석에 다음과 같이 추가합니다.

    produce = "application / json"을 @RequestMapping 주석에 다음과 같이 추가합니다.

    @RequestMapping(value = "api/login", method = RequestMethod.GET, produces = "application/json")
    

    힌트 : 리턴 값으로 ResponseEntity 타입을 사용하는 것이 좋습니다. JSON 본문에서 생성 된 데이터는 하나의 간단한 문자열이 아닌 해당 사양에 따라 배열 또는 객체 여야하기 때문입니다. 때때로 문제가 발생할 수 있습니다 (예 : Observables in Angular2).

    차:

    json으로 반환 된 문자열 : "example"

    Json으로 목록을 반환했습니다 : [ "example"]

  8. ==============================

    8.@ResponseBody 어노테이션을 추가하면 리턴 데이터가 출력 스트림에 기록됩니다.

    @ResponseBody 어노테이션을 추가하면 리턴 데이터가 출력 스트림에 기록됩니다.

  9. ==============================

    9.스프링 MVC 4에서 객체의 기본 응답 유형은 JSON입니다. 그래서 당신이해야 할 일은 당신의 String을 어떤 Object로 감싸는 것입니다.

    스프링 MVC 4에서 객체의 기본 응답 유형은 JSON입니다. 그래서 당신이해야 할 일은 당신의 String을 어떤 Object로 감싸는 것입니다.

        public class StringResponse {
    
       private String response;
    
       public StringResponse(String s) { 
           this.response = s;
       }
    
        // getters and setters 
    }
    

    String 대신 StringResponse를 반환하는 것을 제외하고는 컨트롤러를 수정하지 않습니다.

  10. ==============================

    10.이 주석을 메소드에 추가하십시오.

    이 주석을 메소드에 추가하십시오.

    @RequestMapping(value = "/getString", method = RequestMethod.GET, produces = "application/json")
    
  11. from https://stackoverflow.com/questions/30895286/spring-mvc-how-to-return-simple-string-as-json-in-rest-controller by cc-by-sa and MIT license