HandlerMethodArgumentResolver 란걸 사용할 일이 생겨서 내용을 정리하였다.


HandlerMethodArgumentResolver 스프링 3.1에서 추가된 인터페이스 이다. 

스프링 사용시에 컨트롤러에 파라메터를 수정하거나 공통적으로 추가할 경우 사용한다. 

HandlerMethodArgumentResolver는 사용자 요청이 Controller에 도달하기 전에 요청 파라메터를 수정할 수 있다.



1
2
3
4
5
6
7
8
9
10
public interface HandlerMehtodArgumentResolver {
 
 
    boolean supportsParameter(MethodParameter parameter);
    
    Object resolveArgument(MethodParameter parameter,
            ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
            WebDataBinderFactory binderFactory) throws Exception;
 
}

cs

[HandlerMethodArgumentResolver]


HandlerMethodArgumentResolver 인터페이스는 다음 두 메서드를 제공한다. 

- supportsParameter() : HandlerMethodArgumentResolver가 해당하는 파라미터를 지원할지 여부를 반환한다. true를 반환하면 resolveArgument 메서드가 수행된다.

- resolveArgument() :파라미터의 인자값에 대한 정보를 바탕으로 실제 객체를 생성하여 해당 파라미터 객체에 바인딩합니다.



HandlerMethodArgumentResolver 구현예시 


1) HttpSession 정보를 @LoginUser 어노테이션을 이용해서 받기 


1
2
3
4
5
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginUser {
}

cs

[LoginUser 어노테이션을 생성한다. ]





1
2
3
4
5
6
7
8
9
10
11
12
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modleAndViewContainer, NativeWebRequest webRequest,
            WebDataBinderFactory webDataBinderFactory) throws Exception {
        Object user = webRequest.getAttribute(UserSessionUtils.USER_SESSION_KEY, WebRequest.SCOPE_SESSION);
        return user;
    }
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(LoginUser.class);
    }
}

cs

[HandlerMethodArgumentResolver를 구현한다.]



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SpringBootWebApplication implements WebMvcConfigurer {
 
    @Autowired
    private LoginUserHandlerMethodArgumentResolver loginUserArgumentResolver;
 
    public static void main(String[] args) {
        SpringApplication.run(SpringBootWebApplication.class, args);
    }
 
 
 
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(loginUserArgumentResolver);
 
    }
 
cs


WebMvcConfigurer를  implements 한다음 addArgumentResolvers() 메서드를 오버라이드하여 loginUserArgumentResolver를 추가시켜준다. 








출처 : https://xmfpes.github.io/java/spring-resolver/

참고 :  

https://to-dy.tistory.com/57?category=700248

https://to-dy.tistory.com/60

'개발이야기' 카테고리의 다른 글

스프링부트에서 YAML 사용방법  (0) 2019.04.16
Spring Boot HTTPS 설정하기  (0) 2019.04.13
Spring Jpa LocalDateTime MySql에서 사용하기  (0) 2019.04.12
java8 람다식이란?  (0) 2019.04.11
Java Enum 이란?  (0) 2019.04.10
블로그 이미지

클라인STR

,

Jpa에서 LocalDateTime을 사용할경우 MySql DB사용시 에러가 나거나 아래와 같이 데이터 타입이 이상하게 들어가진다.

1
2
3
4
5
6
7
 
    @Column
    private LocalDateTime createDate;
 
    @Column
    private LocalDateTime updateDate;
 
cs






날짜 타입인 create_date, update_date 컬럼이 tinyblob 이라는 데이터 타입으로 생성이된것을 확인할 수 있다. 



1
2
3
4
5
6
7
8
9
10
11
@SpringBootApplication
@EntityScan(
        basePackageClasses = {Jsr310JpaConverters.class},
        basePackages = {"com.web.domain"})
public class SpringBootWebApplication extends WebMvcConfigurerAdapter {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringBootWebApplication.class, args);
    }
 
 
cs


Application 구동부분에 @EntityScan어노테이션을 추가한다음, basePackageClasses 에 Jsr310JpaConverters.class 클래스를 추가한다음, basePackages 스캔하고자하는 도메인클래스 패키지 위치를 지정한다. 






날짜 타입이 datetime으로 생성된것을 확인할 수 있다.


출처 : https://homoefficio.github.io/2016/11/19/Spring-Data-JPA-%EC%97%90%EC%84%9C-Java8-Date-Time-JSR-310-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/

https://thoughts-on-java.org/persist-localdate-localdatetime-jpa/

'개발이야기' 카테고리의 다른 글

Spring Boot HTTPS 설정하기  (0) 2019.04.13
Spring HandlerMethodArgumentResolver 사용하기  (0) 2019.04.12
java8 람다식이란?  (0) 2019.04.11
Java Enum 이란?  (0) 2019.04.10
Mac Mysql 설치 및 설정하기  (0) 2019.03.20
블로그 이미지

클라인STR

,