스프링 MVC 컨트롤러의 JSON 파라미터
있습니다
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
SessionInfo register(UserProfile profileJson){
...
}
profileJson을 다음과 같이 전달합니다.
http://server/url?profileJson={"email": "mymail@gmail.com"}
그러나 profileJson 객체에 null 필드가 모두 있습니다.봄철 파서를 하려면 어떻게 해야 하나요?
이 해결책은 매우 쉽고 간단하기 때문에 실제로 당신을 웃게 만들 것입니다. 하지만 제가 알기 전에 먼저 Jackson의 고성능 JSON 라이브러리를 활용하지 않고 JSON과 함께 작업할 수 있다는 것을 강조하겠습니다.
Jackson은 Java 개발자를 위한 워크호스이자 디팩토 JSON 라이브러리일 뿐만 아니라 JSON과 Java의 통합을 쉽게 할 수 있는 API 호출 스위트도 제공합니다(http://jackson.codehaus.org/)에서 Jackson을 다운로드할 수 있습니다).
이제 정답을 말씀드리겠습니다.다음과 같은 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...
}
그러면 JSON 값이 {"email"인 GET 파라미터 이름 "profileJson"을 변환하는 Spring MVC 메서드는 컨트롤러에서 다음과 같습니다.mymail@gmail.com}
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으로 변환됩니다.그보다 더 쉬워질 순 없어건배! :-)
이것은 커스텀 에디터를 사용하여 실행할 수 있습니다.이 에디터는 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){
...
}
직접 만들 수 있습니다.Converter
적절한 경우 스프링이 자동으로 사용하도록 합니다.
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
.
스프링 MVC에서 스프링 컨버터 및 유형 변환에 대해 자세히 알아보십시오.
이것으로 시급한 문제는 해결되지만, AJAX 호출을 통해 여러 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;
}
}
더하면 돼요.@RequestBody
앞의
언급URL : https://stackoverflow.com/questions/21577782/json-parameter-in-spring-mvc-controller
'programing' 카테고리의 다른 글
java9에서 모듈 읽기 패키지 오류를 해결하는 방법 (0) | 2023.03.07 |
---|---|
React 어플리케이션의 Firebase 어플리케이션은 어디서 초기화합니까? (0) | 2023.03.07 |
Wordpress에서 사용자 등록을 완전히 비활성화하는 방법이 있습니까? (0) | 2023.03.07 |
jQuery를 사용하여 비동기적으로 이미지 로드 (0) | 2023.03.07 |
열 값을 null SQL Developer로 명시적으로 설정합니다. (0) | 2023.03.07 |