복붙노트

[SPRING] POST 및 SPRING-MVC를 통해 여러 객체를 보내는 문제

SPRING

POST 및 SPRING-MVC를 통해 여러 객체를 보내는 문제

여러 정보를 받아야하는 REST 서비스를 개발 중입니다. 이 경우 두 개의 객체와 속성이 있습니다.

이것은 내가 POST 요청을 테스트하고있는 자바 스크립트입니다.

    var user = {
        username: "admin",
        password: "admin"
    };
    var userToSubscribe = {
        username: "newuser",
        password: "newpassword",
        email: "user@1and1.es"
    };

    var openid = "myopenid";

    $.ajax({
        url: '/myportal/rest/subscribeUser.json',
        type: 'POST',
        dataType: 'json',
        contentType: 'application/json',
        mimeType: 'application/json',
        data: JSON.stringify({ user: user, userToSubscribe: userToSubscribe, openid: openid})    
    });

POST 요청 :

    JSON


    openid
        "myopenid"

    user
        Object { username="admin", password="admin"}

    userToSubscribe
        Object { username="newuser", password="newpassword", email="user@1and1.es"}
    Source
    {"user":{"username":"admin","password":"admin"},"userToSubscribe":{"username":"newuser","password":"newpassword","email":"user@1and1.es"},"openid":"myopenid"}

그리고 POST를 처리하는 컨트롤러 :

    @RequestMapping(method=RequestMethod.POST, value="/subscribeUser.json")
public @ResponseBody Message subscribeUser(@RequestBody("user") User user, @RequestBody("userToSubscribe") User userToSubscribe, @RequestParam String openid){
    ...
}

그리고 그 오류는

POST subscribeUser.json 400 잘못된 요청 localhost : 8080 990 B [:: 1] : 8080

내가 뭘 잘못하고 있죠?

고맙습니다

해결법

  1. ==============================

    1.요청 본문에는 전체 JSON 콘텐츠가 포함됩니다. 따라서 JSON을 매핑하려면 하나의 RequestBody annotated-parameter 만 사용하십시오. 다음과 같이해야합니다.

    요청 본문에는 전체 JSON 콘텐츠가 포함됩니다. 따라서 JSON을 매핑하려면 하나의 RequestBody annotated-parameter 만 사용하십시오. 다음과 같이해야합니다.

    public @ResponseBody Message subscribeUser(@RequestBody String str)
    ObjectMapper mapper = new ObjectMapper();
    JsonNode node = mapper.readTree(str);
    

    그리고 mapper의 convertValue 메소드를 사용하여 문자열에서 다른 객체를 가져옵니다.

    JsonNode node = mapper.readTree(str);
    User theUser = mapper.convertValue(node.get("user"), User.class);
    

    다른 객체들도 마찬가지로

  2. ==============================

    2.@ModelAttributes는 JSON을 허용하는 RESTful 메서드에서 사용할 수 없습니다. 적절한 방법은 @RequestBody를 사용하는 것이라고 여기 있습니다. 대부분의 경우 래퍼 클래스에서 객체를 래핑해야하지만, 이전에 한 번 요청으로 여러 JSON 객체를 직접 전달하지는 않았으므로 잘못되었을 수 있습니다.

    @ModelAttributes는 JSON을 허용하는 RESTful 메서드에서 사용할 수 없습니다. 적절한 방법은 @RequestBody를 사용하는 것이라고 여기 있습니다. 대부분의 경우 래퍼 클래스에서 객체를 래핑해야하지만, 이전에 한 번 요청으로 여러 JSON 객체를 직접 전달하지는 않았으므로 잘못되었을 수 있습니다.

    그렇다면 JSON 인수를 제거하고 가능하면 URI 경로의 일부로 전달하는 대신 REST API를 고려하면 좋은 생각이라고 생각합니다. 나는이 블로그 게시물을 통해 독서를 제안합니다.

  3. ==============================

    3.모든 객체를 포함하는 Java Bean (POJO)을 만들 수 있습니다.

    모든 객체를 포함하는 Java Bean (POJO)을 만들 수 있습니다.

    class JavaBean{
        private User user;
        private UserTOSubscribe  userToSubscribe;
        private Long openId;
    
        // getter and setter
    }
    

    이 빈을 웹 서비스로 전달한다. 그래서 웹 서비스는 ..처럼 보입니다.

    @RequestMapping(method=RequestMethod.POST, value="/subscribeUser.json")
    public @ResponseBody Message subscribeUser(@RequestBody JavaBean javaBean) {
        ...
    }
    
  4. from https://stackoverflow.com/questions/19654120/problems-sending-multiple-objects-through-post-and-spring-mvc by cc-by-sa and MIT license