Spring에서 GET 요청을 복잡한 객체에 매핑합니다.
6786 단어 자바spring-bootspring
하고 싶은 것(목적)
Spring의 GET 요청 (URL 매개 변수)을 복잡한 객체 (Bean)에 매핑합니다.
결론
Mapping용 주석을 사용하지 마십시오.
또는@ModelAttribute
를 사용한다.
※변수명과 URL 파라미터의 키를 맞출 필요가 있습니다.
환경
Spring Boot:2.1.6
기타 사용 라이브러리
lombok
텍토 검증 소스
매핑 대상
상위 객체
@Data
@ToString
public class ComplexBean {
private String hoge;
private ChildBean childBean;
private List<ItemBean> itemBeans;
}
중첩을 위한 자식 객체
@Data
@ToString
public class ChildBean {
private String piyo;
}
목록용 객체
@Data
@ToString
public class ItemBean {
private String fuga;
}
※ @Data
, @ToString
는 lombok의 주석@ToString
는 검증용
컨트롤러
@RestController
public class DemoRestController {
@GetMapping(value = "/param")
@ResponseBody
public String getParam(@RequestParam ComplexBean bean) {
System.out.println(bean.toString());
return bean.toString();
}
@GetMapping(value = "/model")
@ResponseBody
public String getModel(@ModelAttribute ComplexBean bean) {
System.out.println(bean.toString());
return bean.toString();
}
@GetMapping(value = "/direct")
@ResponseBody
public String getDirect(ComplexBean bean) {
System.out.println(bean.toString());
return bean.toString();
}
}
검증
Restlet Client - REST API Testing을 사용하여 각 엔드포인트에 액세스
확인할 URL 매개변수
hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2
결과
@RequestParam
를 사용하는 경우
( http://localhost:8080/param?hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2
)
매핑 정보가 부족하기 때문에 구문 분석 할 수 없어 오류가 발생합니다.
Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required ComplexBean parameter 'bean' is not present]
@ModelAttribute
를 사용하는 경우
( http://localhost:8080/model?hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2
)
예상대로 매핑됩니다.
주석이 없는 경우
( http://localhost:8080/direct?hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2
)
예상대로 매핑됩니다.
요약
다음 구조를 가진 URL 매개변수에서도
- 중첩 구조
- 목록 구조
Mapping용 주석을 사용하지 마십시오.
또는@ModelAttribute
를 사용한다.
그렇다면 매핑할 수 있지만 GET의 요청으로 이런 객체에 매핑하지 않으면 안되는 시점에서 설계를 재검토하자.
덧붙여 검증과 같이 배열 번호를 날렸을 경우는 날려진 가지번호는 null
가 설정된다. (⇒ 하늘의 오브젝트가 되지 않는다)
Reference
이 문제에 관하여(Spring에서 GET 요청을 복잡한 객체에 매핑합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/h_kono0707/items/8242466cc072b6ed5ecf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Spring Boot:2.1.6
기타 사용 라이브러리
lombok
텍토 검증 소스
매핑 대상
상위 객체
@Data
@ToString
public class ComplexBean {
private String hoge;
private ChildBean childBean;
private List<ItemBean> itemBeans;
}
중첩을 위한 자식 객체
@Data
@ToString
public class ChildBean {
private String piyo;
}
목록용 객체
@Data
@ToString
public class ItemBean {
private String fuga;
}
※
@Data
, @ToString
는 lombok의 주석@ToString
는 검증용컨트롤러
@RestController
public class DemoRestController {
@GetMapping(value = "/param")
@ResponseBody
public String getParam(@RequestParam ComplexBean bean) {
System.out.println(bean.toString());
return bean.toString();
}
@GetMapping(value = "/model")
@ResponseBody
public String getModel(@ModelAttribute ComplexBean bean) {
System.out.println(bean.toString());
return bean.toString();
}
@GetMapping(value = "/direct")
@ResponseBody
public String getDirect(ComplexBean bean) {
System.out.println(bean.toString());
return bean.toString();
}
}
검증
Restlet Client - REST API Testing을 사용하여 각 엔드포인트에 액세스
확인할 URL 매개변수
hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2
결과
@RequestParam
를 사용하는 경우
( http://localhost:8080/param?hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2
)
매핑 정보가 부족하기 때문에 구문 분석 할 수 없어 오류가 발생합니다.
Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required ComplexBean parameter 'bean' is not present]
@ModelAttribute
를 사용하는 경우
( http://localhost:8080/model?hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2
)
예상대로 매핑됩니다.
주석이 없는 경우
( http://localhost:8080/direct?hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2
)
예상대로 매핑됩니다.
요약
다음 구조를 가진 URL 매개변수에서도
- 중첩 구조
- 목록 구조
Mapping용 주석을 사용하지 마십시오.
또는@ModelAttribute
를 사용한다.
그렇다면 매핑할 수 있지만 GET의 요청으로 이런 객체에 매핑하지 않으면 안되는 시점에서 설계를 재검토하자.
덧붙여 검증과 같이 배열 번호를 날렸을 경우는 날려진 가지번호는 null
가 설정된다. (⇒ 하늘의 오브젝트가 되지 않는다)
Reference
이 문제에 관하여(Spring에서 GET 요청을 복잡한 객체에 매핑합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/h_kono0707/items/8242466cc072b6ed5ecf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required ComplexBean parameter 'bean' is not present]
다음 구조를 가진 URL 매개변수에서도
- 중첩 구조
- 목록 구조
Mapping용 주석을 사용하지 마십시오.
또는
@ModelAttribute
를 사용한다.그렇다면 매핑할 수 있지만 GET의 요청으로 이런 객체에 매핑하지 않으면 안되는 시점에서 설계를 재검토하자.
덧붙여 검증과 같이 배열 번호를 날렸을 경우는 날려진 가지번호는
null
가 설정된다. (⇒ 하늘의 오브젝트가 되지 않는다)
Reference
이 문제에 관하여(Spring에서 GET 요청을 복잡한 객체에 매핑합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/h_kono0707/items/8242466cc072b6ed5ecf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)