스프링 MVC - Rest 컨트롤러에서 단순 문자열을 JSON으로 반환하는 방법
제 질문은 본질적으로 이 질문에 대한 후속 조치입니다.
@RestController
public class TestController
{
@RequestMapping("/getString")
public String getString()
{
return "Hello World";
}
}
위에서 Spring은 응답 본문에 "Hello World"를 추가합니다.String을 JSON 응답으로 반환하려면 어떻게 해야 하나요?인용구를 추가할 수 있다는 것은 알지만, 그건 해킹에 가까운 느낌입니다.
이 개념을 설명하는 데 도움이 되는 예를 제시해 주십시오.
주의: HTTP Response 본문에 직접 쓰지 않고 JSON 형식으로 문자열을 반환합니다(Resty에서 컨트롤러를 사용하고 있습니다).응답이 유효한 JSON 형식이어야 하는 GWT).
중 를 반환한다.text/plain
(Return only string message from Spring MVC 3 Controller) 또는 wrap your String은 오브젝트입니다.
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(매핑 의존성 정보)를 사용하여 이 문제를 해결했습니다.래퍼 오브젝트보다 단순한 String을 반환하는 것을 선호하기 때문에 이 옵션을 선택했습니다.새로운 의존관계를 추가하지 않으면 내부 도우미 클래스를 쉽게 사용할 수 있습니다.
사용 예:
@RestController
public class TestController
{
@RequestMapping("/getString")
public String getString()
{
return JSONObject.quote("Hello World");
}
}
반환할 수 .JSON
String
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.removeIf(c -> c instanceof StringHttpMessageConverter);
}
}
컨트롤러 액션핸들러 방식과 컨트롤러 예외 핸들러 양쪽에서 테스트 완료:
@RequestMapping("/foo")
public String produceFoo() {
return "foo";
}
@ExceptionHandler(FooApiException.class)
public String fooException(HttpServletRequest request, Throwable e) {
return e.getMessage();
}
최종 메모:
extendMessageConverters
4.1할 수 있습니다. Spring 4.1.3을 사용하여 동일한 할 수 .이전 버전에서 가동하고 있는 경우는, 다음의 방법으로 같은 기술을 실장할 수 있습니다.configureMessageConverters
을 사용하다- 이는 다른 많은 접근법 중 하나였습니다. 애플리케이션에서 JSON만 반환하고 다른 콘텐츠 유형은 반환하지 않는 경우 기본 변환기를 건너뛰고 단일 잭슨 변환기를 추가하는 것이 좋습니다.또 다른 접근법은 기본 컨버터를 추가하지만 잭슨 컨버터가 문자열 컨버터보다 우선하도록 다른 순서로 추가하는 것입니다.이를 통해 컨트롤러 액션 방식이 응답 미디어 유형에 따라 String 변환 방법을 지정할 수 있습니다.
이 질문이 오래되었다는 것을 알지만 저도 기여하고 싶습니다.
다른 응답의 주요 차이점은 해시맵 반환입니다.
@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);
}
더하다produces = "application/json"
에@RequestMapping
주석:
@RequestMapping(value = "api/login", method = RequestMethod.GET, produces = "application/json")
힌트: 반환값으로 사용할 것을 권장합니다.ResponseEntity<List<T>>
타입. 왜냐하면 JSON 본문에서 생성되는 데이터는 하나의 단순한 문자열이 아니라 사양에 따른 배열 또는 객체여야 하기 때문이다.때때로 문제가 발생할 수 있습니다(예: Angular2의 관측 가능).
차이점:
반환했다String
json:"example"
반환했다List<String>
json:["example"]
더하다@ResponseBody
주석 - 출력 스트림에 반환 데이터를 씁니다.
이 문제는 나를 미치게 한다: 스프링은 매우 강력한 도구이지만 JSON과 같은 출력 문자열을 쓰는 것은 못생긴 해커가 없으면 불가능해 보인다.
(Kotlin에서) 가장 간섭이 적고 가장 투과적이라고 판단되는 솔루션은 컨트롤러 어드바이스를 사용하여 요구가 특정 엔드포인트 세트(일반적으로 REST API)로 전송되었는지 여부를 확인하는 것입니다.이는 대부분의 경우 여기에서 모든 응답을 JSON으로 반환하고 반환된 데이터가 플레인인지 여부에 따라 프런트엔드로 전문화하지 않기 때문입니다.문자열('JSON 역직렬화 실행 안 함!') 또는 다른 문자열('JSON 역직렬화 실행!')입니다.이것의 긍정적인 측면은 컨트롤러가 동일하고 해크가 없는 상태를 유지한다는 것입니다.
그supports
method를 통해 처리되는 모든 요구는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
출력에는 를 사용해야 합니다.
언급URL : https://stackoverflow.com/questions/30895286/spring-mvc-how-to-return-simple-string-as-json-in-rest-controller
'programing' 카테고리의 다른 글
IntelliJ IDEA를 사용하여 사용하지 않는 코드를 찾으려면 어떻게 해야 합니까? (0) | 2022.08.17 |
---|---|
VueJs: 컴포넌트 마운트 실패 (0) | 2022.08.17 |
데이터 로드 처리 - Vue (0) | 2022.08.17 |
동일한 기호 중 일부를 사용하여 두 개의 공유 라이브러리 연결 (0) | 2022.08.17 |
Java에서 현재 연도의 정수 값을 가져옵니다. (0) | 2022.08.14 |