spring controller 에서 get parameter 를 object 로 변환해서 받을 때 immutable 객체는 기본적으로 파라미터가 객체 안에 변수로 채워지지 않는다.
(굳이 immutable 객체로 request parameter 를 받고 싶으면 HandlerMethodArgumentResolver 를 상속받아 구현하고 resolver spring bean을 추가해야 한다.)
Case 1. mutable 객체를 사용할 때는 파라미터가 객체 안에 변수 값으로 잘 채워진다.
@GetMapping("/temp1")
@ResponseBody
public ResponseEntity temp1(TestParam1 param)
{
System.out.println("a : " + param.getA());
System.out.println("b : " + param.getB());
return ResponseEntity.ok("ok");
}
@Data
public static class TestParam1
{
private String a;
private int b;
}
/temp1?a=1&b=2 URL 호출
결과
a : 1
b : 2
Case 2. immutable 객체를 사용할 때는 파라미터가 객체 안에 변수 값으로 채워지지 않는다.
@GetMapping("/temp2")
@ResponseBody
public ResponseEntity temp(TestParam2 param) {
System.out.println("a : " + param.getA());
System.out.println("b : " + param.getB());
return ResponseEntity.ok("ok");
}
public static class TestParam2 {
private final String a;
private final int b;
public TestParam2() { this(null, 0); }
public TestParam2(String a, int b) {
this.a = a;
this.b = b;
}
public String getA() { return a; }
public int getB() { return b; }
}
/temp2?a=1&b=2 URL 호출 결과
a : null
b : 0
Case 3. immutable 객체와 HandlerMethodArgumentResolver 를 같이 사용할 때는 파라미터가 객체 안에 변수 값으로 채워진다.
@GetMapping("/temp3")
@ResponseBody
public ResponseEntity temp(TestParam3 param) {
System.out.println("a : " + param.getA());
System.out.println("b : " + param.getB());
return ResponseEntity.ok("ok");
}
public static class TestParam3 {
private final String a;
private final int b;
public TestParam3() { this(null, 0); }
public TestParam3(String a, int b) {
this.a = a;
this.b = b;
}
public String getA() { return a; }
public int getB() { return b; }
}
public static class TestParam3WebArgumentResolver implements HandlerMethodArgumentResolver {
@Override public boolean supportsParameter(MethodParameter parameter) {
return TestParam3.class.equals(parameter.getParameterType());
}
@Override public Object resolveArgument(MethodParameter parameter
, @Nullable ModelAndViewContainer mavContainer
, NativeWebRequest webRequest
, @Nullable WebDataBinderFactory binderFactory) throws Exception {
if (supportsParameter(parameter)) {
ServletWebRequest servletWebRequest = (ServletWebRequest) webRequest;
HttpServletRequest request = servletWebRequest.getRequest();
String a = request.getParameter("a");
String b = request.getParameter("b");
return new TestParam3(a, (StringUtils.isEmpty(b)) ? 0 : Integer.parseInt(b));
}
return WebArgumentResolver.UNRESOLVED;
}
}
WebMvcConfigurer 를 implements 한 곳에서는 아래와 같이 resolver 를 등록
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new TestParam3WebArgumentResolver());
}
/temp3?a=1&b=2 URL 호출 결과
a : 1
b : 2
'Dev > backend' 카테고리의 다른 글
spring cloud overview (0) | 2022.07.30 |
---|---|
yum 으로 openjdk 설치 (0) | 2017.11.30 |
자카르타 DBCP - JNDI 를 사용한 connection pool (0) | 2017.11.01 |