본문 바로가기
Dev/backend

spring mvc 에서 get parameter 를 object 로 사용 시 불변객체 주의

by Luigi.yoon 2018. 3. 7.

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