Spring Boot에서 응답으로 JSON 개체를 반환하는 중
Spring Boot에 Rest Controller 샘플이 있습니다.
@RestController
@RequestMapping("/api")
class MyRestController
{
@GetMapping(path = "/hello")
public JSONObject sayHello()
{
return new JSONObject("{'aa':'bb'}");
}
}
JSON 라이브러리를 사용하고 있습니다.
를 눌렀을 때/hello
으로 '하다'라는 이 있어요
경로 []의 컨텍스트에서 Servlet [dispatcherServlet]의 Servlet.service()가 예외 [Request Processing failed; nested 예외는 java.lang입니다.부정 인수예외:유형: class org.json의 반환 값에 대한 변환기를 찾을 수 없습니다.근본 원인을 가진 JSONObject]
java.displaces를 클릭합니다.부정 인수예외:유형: class org.json의 반환 값에 대한 변환기를 찾을 수 없습니다.JSONObject
뭐가 문제죠?정확히 무슨 일이 일어나고 있는지 누가 설명해 줄 수 있나요?
Spring Boot Web을 사용하고 있기 때문에 Jackson 의존관계는 암묵적이며 명시적으로 정의할 필요는 없습니다.에 대한 할 수 .pom.xml
종속성 계층 탭에서 이클립스를 사용하는 경우.
아까 @RestController
조손POJO를 반환하면 잭슨의 시리얼라이저가 json으로 변환할 것입니다.은 '어느 정도'를 사용하는 것과 .@ResponseBody
@Controller @ @ @ 。배치하는 것보다@ResponseBody
에서 ""를 배치합니다.@RestController
@Controller
★★★★★★★★★★★★★★★★★」@ResponseBody
기본적으로는 컨트롤러의 모든 리소스에 적용됩니다.
이치노https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebodyhttpsdocs.spring.io/spring/docs/current//html/mvc.html#mvc-ann-responsebody
문제가 발생하고 있는 것은 반환된 오브젝트(JSONObject)에 특정 속성에 대한 getter가 없기 때문입니다.하는 것이 입니다.POJO 러돌돌
이치노https://stackoverflow.com/a/35822500/5039001https.com/a/35822500/5039001
json 직렬 문자열을 반환하려면 문자열을 반환하십시오.이 경우 스프링은 JSON 컨버터 대신 StringHttpMessageConverter를 사용합니다.
현재 접근 방식이 작동하지 않는 이유는 잭슨이 기본적으로 객체를 직렬화 및 직렬화 해제하는 데 사용되기 때문입니다.', '어느 정도', '어울리다', '어울리다', '어울리다'를 어떻게 는 몰라요.JSONObject
JSON하려면 , 「다이나믹 JSON」을 사용할 수 Map
예를 들어 다음과 같습니다.
@GetMapping
public Map<String, String> sayHello() {
HashMap<String, String> map = new HashMap<>();
map.put("key", "value");
map.put("foo", "bar");
map.put("aa", "bb");
return map;
}
이것에 의해, 다음의 JSON 응답이 발생합니다.
{ "key": "value", "foo": "bar", "aa": "bb" }
이것은 하위 개체를 추가하는 것이 조금 더 어려워질 수 있기 때문에 조금 제한적입니다.잭슨만의 메커니즘이 있는데ObjectNode
그리고.ArrayNode
·사용하려면 , 자동 배선이 필요합니다.ObjectMapper
서비스/컨트롤러에 있습니다.다음으로 다음을 사용할 수 있습니다.
@GetMapping
public ObjectNode sayHello() {
ObjectNode objectNode = mapper.createObjectNode();
objectNode.put("key", "value");
objectNode.put("foo", "bar");
objectNode.put("number", 42);
return objectNode;
}
이 방법을 사용하면 하위 개체, 어레이를 추가하고 모든 다양한 유형을 사용할 수 있습니다.
다음과 같이 응답을 반환할 수 있습니다.String
@vagaasen이 제안하는 바와 같이 또는 사용할 수 있습니다.ResponseEntity
스프링에서 제공하는 오브젝트는 다음과 같습니다.이 방법으로 당신도 돌아갈 수 있습니다.Http status code
웹 서비스 호출에서 더 유용합니다.
@RestController
@RequestMapping("/api")
public class MyRestController
{
@GetMapping(path = "/hello", produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> sayHello()
{
//Get data from service layer into entityList.
List<JSONObject> entities = new ArrayList<JSONObject>();
for (Entity n : entityList) {
JSONObject entity = new JSONObject();
entity.put("aa", "bb");
entities.add(entity);
}
return new ResponseEntity<Object>(entities, HttpStatus.OK);
}
}
해시맵을 사용하여
@GetMapping
public Map<String, Object> get() {
Map<String, Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("results", somePOJO);
return map;
}
API 쿼리에 대한 DTO 생성(예: 엔티티)이 더 정확합니다.DTO:
- 엔티티 목록과 함께 기본 응답 OK:
@GetMapping(produces=MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.OK) public List<EntityDto> getAll() { return entityService.getAllEntities(); }
그러나 다른 Map 파라미터를 반환해야 할 경우 다음 두 가지 예를 사용할 수 있습니다.
2. 맵과 같은 하나의 파라미터를 반환하는 경우:
@GetMapping(produces=MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<Object> getOneParameterMap() { return ResponseEntity.status(HttpStatus.CREATED).body( Collections.singletonMap("key", "value")); }
- 일부 파라미터의 반환맵이 필요한 경우(Java 9 이후):
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<Object> getSomeParameters() { return ResponseEntity.status(HttpStatus.OK).body(Map.of( "key-1", "value-1", "key-2", "value-2", "key-3", "value-3")); }
@RequestMapping("/api/status")
public Map doSomething()
{
return Collections.singletonMap("status", myService.doSomething());
}
PS. 1개의 값으로만 동작
String을 사용하여 JSON 개체를 반환해야 하는 경우 다음 기능이 작동합니다.
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.ResponseEntity;
...
@RestController
@RequestMapping("/student")
public class StudentController {
@GetMapping
@RequestMapping("/")
public ResponseEntity<JsonNode> get() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
JsonNode json = mapper.readTree("{\"id\": \"132\", \"name\": \"Alice\"}");
return ResponseEntity.ok(json);
}
...
}
사용하다ResponseEntity<ResponseBean>
여기서는 ResponseBean 또는 Any java bean을 사용하여 API 응답을 반환할 수 있습니다.이것은 베스트 프랙티스입니다.응답에 Enum을 사용했습니다.API 상태 코드와 상태 메시지를 반환합니다.
@GetMapping(path = "/login")
public ResponseEntity<ServiceStatus> restApiExample(HttpServletRequest request,
HttpServletResponse response) {
String username = request.getParameter("username");
String password = request.getParameter("password");
loginService.login(username, password, request);
return new ResponseEntity<ServiceStatus>(ServiceStatus.LOGIN_SUCCESS,
HttpStatus.ACCEPTED);
}
또는 (Response Body)의 경우
public enum ServiceStatus {
LOGIN_SUCCESS(0, "Login success"),
private final int id;
private final String message;
//Enum constructor
ServiceStatus(int id, String message) {
this.id = id;
this.message = message;
}
public int getId() {
return id;
}
public String getMessage() {
return message;
}
}
Spring REST API의 응답 키는 다음과 같습니다.
- 상태 코드
- 메세지
아래 최종 답변을 받으실 수 있습니다.
{
"StatusCode" : "0",
"Message":"Login success"
}
요건에 따라 Response Body(java POJO, ENUM 등)를 사용할 수 있습니다.
org.json의 toMap() 메서드를 사용하여 컨트롤러에서 Map <String, Object>를 반환합니다.JSONObject는 다음과 같습니다.
@GetMapping("/json")
public Map<String, Object> getJsonOutput() {
JSONObject jsonObject = new JSONObject();
//construct jsonObject here
return jsonObject.toMap();
}
다음과 같이 할 수 있습니다.
@RestController
@RequestMapping("/api")
class MyRestController
{
@GetMapping(path = "/hello")
public JSONObject sayHello()
{
return new JSONObject("{'aa':'bb'}").toMap();;
}
}
언급URL : https://stackoverflow.com/questions/44839753/returning-json-object-as-response-in-spring-boot
'IT' 카테고리의 다른 글
명시적 약속 구성 반대는 무엇이며 어떻게 피해야 합니까? (0) | 2022.11.07 |
---|---|
개체가 특정 유형임을 주장합니다. (0) | 2022.11.07 |
sleep()의 JavaScript 버전은 무엇입니까? (0) | 2022.11.07 |
필드 이름 주위에 백틱 사용 (0) | 2022.11.07 |
Axios에서 헤더와 옵션을 설정하려면 어떻게 해야 합니다. (0) | 2022.11.07 |