가끔은 @RequestBody 자체에 날라오는 Json값을 수동으로 받기 위해서, 또는 여러 JSON데이터를 받고 DTO에 직접 넣지않고 내가 제어하기 위해서 사용하고 싶을때가 있다.
Controller에서 위와 같은 상황을 제어 할 수 있는 방법이 있다.
Controller
@RequiredArgsConstructor
@RestController
public class ApiController{
private final ApiService apiService;
@PostMapping (value ="경로", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Long save(@RequestBody(required = false) String node){
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(objectNode);
JsonNode jsonNoe = objectMapper.readTree(objectNode);
JsonNode memberNode = jsonNode.get("memberRequest");
JsonNode notListNode = jsonNode.get("notListNode");
// 만약 List형일경우
ArrayNode arrayMemberNode = (ArrayNode) memberNode;
NotListDto notListDto =
objectMapper.convertValue(notListNode, new TypeReference<NotListDto>(){});
List<MemberDto> memberDtos =
objectMapper.convertValue(memberNode, new TypeREference<List<MemberDto>>(){};
return apiService.save(notListDto, memberDtos);
}
}
우선 ObjectMapper를 이용해서 웹페이지에서 JSON데이터를 전송한 값을 받는다.
받은 값을 writeValueAsString메서드를 이용하여 String형으로 변환한다.
JsonNode 라는 객체를 이용해서 값을 읽어온다.
그중에서 웹페이지에서 data를 전송할때 Key값이 되는 부분을 읽는다.
(jsonNode.get("");)
List일경우 List형으로 한번 더 묶어서 service로 전달한다.