[SPRING] json 수신 및 deserialize 같이 봄 mvc 컨트롤러에서 개체 목록
SPRINGjson 수신 및 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.저에게 맞는 코드는 다음과 같습니다. 핵심은 래퍼 클래스가 필요하다는 것입니다.
저에게 맞는 코드는 다음과 같습니다. 핵심은 래퍼 클래스가 필요하다는 것입니다.
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.이것은 당신이 시도하는 방식으로 가능하지 않습니다. 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.
@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.나를 위해 코드 아래에, 먼저 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.솔루션은 매우 잘 작동하며,
솔루션은 매우 잘 작동하며,
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) { ... }
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
'SPRING' 카테고리의 다른 글
[SPRING] Tomcat 서버에 스프링 부트 웹 응용 프로그램을 배포하는 방법 (0) | 2019.01.10 |
---|---|
[SPRING] JDBC 템플릿 용으로 어떤 트랜잭션 관리자를 사용해야합니까? JPA를 사용할 때? (0) | 2019.01.10 |
[SPRING] Spring 3.0에서 다중 선택 MVC (0) | 2019.01.10 |
[SPRING] org.springframework.data.mapping.PropertyReferenceException : 유형에 대한 속성 catch가 없습니다. (0) | 2019.01.10 |
[SPRING] Spring Data JPA로 사용자 정의 저장소를 만들려고 시도 할 때 유형 오류에 대한 속성을 찾을 수 없습니다 (0) | 2019.01.10 |