복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    5.이 매개 변수 앞에 @RequestBody 주석을 추가하기 만하면됩니다.

    이 매개 변수 앞에 @RequestBody 주석을 추가하기 만하면됩니다.

  6. from https://stackoverflow.com/questions/21577782/json-parameter-in-spring-mvc-controller by cc-by-sa and MIT license