복붙노트

[SPRING] json 수신 및 deserialize 같이 봄 mvc 컨트롤러에서 개체 목록

SPRING

json 수신 및 deserialize 같이 봄 mvc 컨트롤러에서 개체 목록

내 코드는 아래와 같습니다.

제어 장치

@RequestMapping(value="/setTest", method=RequestMethod.POST, consumes="application/json")
public @ResponseBody ModelMap setTest(@RequestBody List<TestS> refunds, ModelMap map) {
    for(TestS r : refunds) {
        System.out.println(r.getName());
    }
    // other codes
}

테스트 용

public class TestS implements Serializable {
    private String name;
    private String age;
    //getter setter
}

Json 요청

var z = '[{"name":"1","age":"2"},{"name":"1","age":"3"}]';
$.ajax({
    url: "/setTest",
    data: z,
    type: "POST",
    dataType:"json",
    contentType:'application/json'               
});

이 오류가 발생했습니다.

나는 봄 3.1.2와 잭슨 2.0.4를 사용하고있다.

편집 : 내 컨트롤러 메서드에서 TestS 개체 목록을 받고 처리 할. 나는 잘못된 json을 보내거나 내 메소드 서명이 잘못되었는지를 알 수 없습니다.

해결법

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

    1.저에게 맞는 코드는 다음과 같습니다. 핵심은 래퍼 클래스가 필요하다는 것입니다.

    저에게 맞는 코드는 다음과 같습니다. 핵심은 래퍼 클래스가 필요하다는 것입니다.

    public class Person {
    
        private String name;
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    

    Person 래퍼 클래스

    public class PersonWrapper {
    
        private List<Person> persons;
    
        /**
         * @return the persons
         */
        public List<Person> getPersons() {
            return persons;
        }
    
        /**
         * @param persons the persons to set
         */
        public void setPersons(List<Person> persons) {
            this.persons = persons;
        }
    }
    

    내 컨트롤러 메서드

    @RequestMapping(value="person", method=RequestMethod.POST,consumes="application/json",produces="application/json")
        @ResponseBody
        public List<String> savePerson(@RequestBody PersonWrapper wrapper) {
            List<String> response = new ArrayList<String>();
            for (Person person: wrapper.getPersons()){
            personService.save(person);
             response.add("Saved person: " + person.toString());
        }
            return response;
        }
    

    POST에서 보내진 요청은 json입니다.

    {"persons":[{"name":"shail1","age":"2"},{"name":"shail2","age":"3"}]}
    

    응답은

    ["Saved person: Person [name=shail1, age=2]","Saved person: Person [name=shail2, age=3]"]
    
  2. ==============================

    2.이것은 당신이 시도하는 방식으로 가능하지 않습니다. Jackson 언 마샬링은 형식 지우기 후에 컴파일 된 Java 코드에서 작동합니다. 그래서 너

    이것은 당신이 시도하는 방식으로 가능하지 않습니다. Jackson 언 마샬링은 형식 지우기 후에 컴파일 된 Java 코드에서 작동합니다. 그래서 너

    public @ResponseBody ModelMap setTest(@RequestBody List<TestS> refunds, ModelMap map) 
    

    정말로 오직

    public @ResponseBody ModelMap setTest(@RequestBody List refunds, ModelMap map) 
    

    (목록 arg에 제네릭이 없습니다).

    Unmarshalling List가 LinkedHashMap 일 때 Jackson이 생성하는 기본 유형입니다.

    @Saint에서 언급했듯이 다음과 같이 목록에 대해 자신 만의 유형을 만들어이를 우회 할 수 있습니다.

    class TestSList extends ArrayList<TestS> { }
    

    컨트롤러 서명을 다음과 같이 수정하십시오.

    public @ResponseBody ModelMap setTest(@RequestBody TestSList refunds, ModelMap map) {
    
  3. ==============================

    3.

    @RequestMapping(
             value="person", 
             method=RequestMethod.POST,
             consumes="application/json",
             produces="application/json")
    @ResponseBody
    public List<String> savePerson(@RequestBody Person[] personArray) {
        List<String> response = new ArrayList<String>();
        for (Person person: personArray) {
            personService.save(person);
            response.add("Saved person: " + person.toString());
        }
        return response;
    }
    

    위와 같이 Array를 사용할 수 있습니다.

  4. ==============================

    4.나를 위해 코드 아래에, 먼저 json 문자열을 적절한 헤더와 함께 보낸다.

    나를 위해 코드 아래에, 먼저 json 문자열을 적절한 헤더와 함께 보낸다.

    $.ajax({
            type: "POST",
            url : 'save',
            data : JSON.stringify(valObject),
            contentType:"application/json; charset=utf-8",
            dataType:"json",
            success : function(resp){
                console.log(resp);
            },
            error : function(resp){
                console.log(resp);
            }
        });
    

    그리고 나서 Spring 측에서 -

    @RequestMapping(value = "/save", 
                    method = RequestMethod.POST,
                    consumes="application/json")
    public @ResponseBody String  save(@RequestBody ArrayList<KeyValue> keyValList) {
        //Saving call goes here
        return "";
    }
    

    여기 KeyValue는 JSON 구조에 해당하는 간단한 pojo입니다. 원하는대로 생성 할 수 있습니다. 간단히 문자열을 반환합니다.

    내 json 객체는 다음과 같습니다.

    [{"storedKey":"vc","storedValue":"1","clientId":"1","locationId":"1"},
     {"storedKey":"vr","storedValue":"","clientId":"1","locationId":"1"}]
    
  5. ==============================

    5.솔루션은 매우 잘 작동하며,

    솔루션은 매우 잘 작동하며,

    public List<String> savePerson(@RequestBody Person[] personArray)  
    

    이 서명을 위해 우편 배달부에서 Person 배열을 전달할 수 있습니다.

    [
    {
      "empId": "10001",
      "tier": "Single",
      "someting": 6,
      "anything": 0,
      "frequency": "Quaterly"
    }, {
      "empId": "10001",
      "tier": "Single",
      "someting": 6,
      "anything": 0,
      "frequency": "Quaterly"
    }
    ]
    

    소비 태그를 추가하는 것을 잊지 마세요 :

    @RequestMapping(value = "/getEmployeeList", method = RequestMethod.POST, consumes="application/json", produces = "application/json")
    public List<Employee> getEmployeeDataList(@RequestBody Employee[] employeearray) { ... }
    
  6. from https://stackoverflow.com/questions/23012841/receiving-json-and-deserializing-as-list-of-object-at-spring-mvc-controller by cc-by-sa and MIT license