[SPRING] 스프링 MVC 컨트롤러의 JSON 매개 변수
SPRING스프링 MVC 컨트롤러의 JSON 매개 변수
나는 가지고있다
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
SessionInfo register(UserProfile profileJson){
...
}
나는 profileJson을 다음과 같이 전달한다.
http://server/url?profileJson={"email": "mymail@gmail.com"}
내 profileJson 객체에는 모든 null 필드가 있습니다. 스프링이 내 아들을 파싱하도록하려면 어떻게해야합니까?
해결법
-
==============================
1.JSON을 UserProfile 객체로 변환하는 사용자 정의 편집기로이 작업을 수행 할 수 있습니다.
JSON을 UserProfile 객체로 변환하는 사용자 정의 편집기로이 작업을 수행 할 수 있습니다.
public class UserProfileEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { ObjectMapper mapper = new ObjectMapper(); UserProfile value = null; try { value = new UserProfile(); JsonNode root = mapper.readTree(text); value.setEmail(root.path("email").asText()); } catch (IOException e) { // handle error } setValue(value); } }
이것은 컨트롤러 클래스에 편집기를 등록하기위한 것입니다 :
@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(UserProfile.class, new UserProfileEditor()); }
JSONP 매개 변수를 언 마샬링하기 위해 편집기를 사용하는 방법입니다.
@RequestMapping(value = "/jsonp", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) @ResponseBody SessionInfo register(@RequestParam("profileJson") UserProfile profileJson){ ... }
-
==============================
2.이 솔루션은 매우 간단하고 쉽기 때문에 실제로 웃을 수 있습니다.하지만 그것에 착수하기 전에 먼저 자기 존중하는 Java 개발자는 절대 없을 것이라고 강조합니다. 잭슨 하이를 사용하지 않고 JSON을 사용했다는 것을 강조합니다. - 성능 JSON 라이브러리.
이 솔루션은 매우 간단하고 쉽기 때문에 실제로 웃을 수 있습니다.하지만 그것에 착수하기 전에 먼저 자기 존중하는 Java 개발자는 절대 없을 것이라고 강조합니다. 잭슨 하이를 사용하지 않고 JSON을 사용했다는 것을 강조합니다. - 성능 JSON 라이브러리.
Jackson은 Java 개발자를위한 작업 말이자 defacto JSON 라이브러리 일뿐 아니라 Java와 JSON의 통합을 케이크 전체로 만드는 API 호출을 제공합니다 (http : //jackson.codehaus에서 Jackson을 다운로드 할 수 있습니다. org /).
이제 대답 해주세요. 다음과 같은 UserProfile pojo가 있다고 가정합니다.
public class UserProfile { private String email; // etc... public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } // more getters and setters... }
... JSET 값이 { "email": "mymail@gmail.com"} 인 GET 매개 변수 이름 "profileJson"을 컨트롤러로 변환하는 Spring MVC 메서드는 다음과 같습니다.
import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; // this is your lifesaver right here //.. your controller class, blah blah blah @RequestMapping(value="/register", method = RequestMethod.GET) public SessionInfo register(@RequestParam("profileJson") String profileJson) throws JsonMappingException, JsonParseException, IOException { // now simply convert your JSON string into your UserProfile POJO // using Jackson's ObjectMapper.readValue() method, whose first // parameter your JSON parameter as String, and the second // parameter is the POJO class. UserProfile profile = new ObjectMapper().readValue(profileJson, UserProfile.class); System.out.println(profile.getEmail()); // rest of your code goes here. }
빵! 너 끝났어. 제가 말씀 드렸듯이 Jackson API의 대부분을 살펴 보는 것이 좋습니다. 생명의 은인입니다. 예를 들어 컨트롤러에서 JSON을 반환하고 있습니까? 그렇다면 lib에 JSON을 포함하고 POJO를 반환하면 Jackson이 자동으로 JSON으로 변환합니다. 그것보다 훨씬 쉽게 얻을 수 없습니다. 건배! :-)
-
==============================
3.이를 수행하는 가장 좋은 방법은 전달하려는 두 개 또는 여러 개의 객체가 포함 된 래퍼 객체를 만드는 것입니다. 그런 다음 JSON 객체를 두 객체의 배열로 구성합니다.
이를 수행하는 가장 좋은 방법은 전달하려는 두 개 또는 여러 개의 객체가 포함 된 래퍼 객체를 만드는 것입니다. 그런 다음 JSON 객체를 두 객체의 배열로 구성합니다.
[ { "name" : "object1", "prop1" : "foo", "prop2" : "bar" }, { "name" : "object2", "prop1" : "hello", "prop2" : "world" } ]
그런 다음 컨트롤러 메서드에서 요청 본문을 단일 개체로 받고 두 개의 포함 된 개체를 추출합니다. 즉 :
@RequestMapping(value="/handlePost", method = RequestMethod.POST, consumes = { "application/json" }) public void doPost(@RequestBody WrapperObject wrapperObj) { Object obj1 = wrapperObj.getObj1; Object obj2 = wrapperObj.getObj2; //Do what you want with the objects... }
래퍼 객체는 다음과 같이 보일 것입니다 ...
public class WrapperObject { private Object obj1; private Object obj2; public Object getObj1() { return obj1; } public void setObj1(Object obj1) { this.obj1 = obj1; } public Object getObj2() { return obj2; } public void setObj2(Object obj2) { this.obj2 = obj2; } }
-
==============================
4.당신은 자신의 Converter를 생성하고 Spring이 자동으로 그것을 사용하도록 할 수 있습니다 :
당신은 자신의 Converter를 생성하고 Spring이 자동으로 그것을 사용하도록 할 수 있습니다 :
import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; @Component class JsonToUserProfileConverter implements Converter<String, UserProfile> { private final ObjectMapper jsonMapper = new ObjectMapper(); public UserProfile convert(String source) { return jsonMapper.readValue(source, UserProfile.class); } }
다음 제어기 메소드에서 볼 수 있듯이 특별한 것은 필요하지 않습니다.
@GetMapping @ResponseBody public SessionInfo register(@RequestParam UserProfile userProfile) { ... }
구성 요소를 사용하여 @Component로 변환기 클래스를 스캔하고 주석을 추가하면 Spring이 자동으로 변환기를 선택합니다.
Spring MVC에서 Spring Converter와 타입 변환에 대해 더 배워 보자.
-
==============================
5.이 매개 변수 앞에 @RequestBody 주석을 추가하기 만하면됩니다.
이 매개 변수 앞에 @RequestBody 주석을 추가하기 만하면됩니다.
from https://stackoverflow.com/questions/21577782/json-parameter-in-spring-mvc-controller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 4 - 정적 리소스를 해결하지 않는 addResourceHandlers (0) | 2018.12.07 |
---|---|
[SPRING] 자바 설정으로 Spring에서 404 에러 리디렉션 (0) | 2018.12.07 |
[SPRING] 개체 목록을 thymeleaf에 바인딩하는 방법은 무엇입니까? (0) | 2018.12.07 |
[SPRING] @PostConstruct 메서드의 @Transactional (0) | 2018.12.07 |
[SPRING] Spring Web MVC - 개별 요청 매개 변수 유효성 검사 (0) | 2018.12.07 |