250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- AJAX
- SpringBoot
- Source
- 오픈소스
- IntelliJ
- oracle
- Tomcat
- MySQL
- maven
- JavaScript
- Docker
- Thymeleaf
- Core Java
- myBatis
- jpa
- 문서
- Open Source
- 설정
- ubuntu
- Python
- error
- Spring Boot
- JDBC
- spring
- git
- STS
- Eclipse
- PostgreSQL
- MSSQL
- Exception
Archives
- Today
- Total
헤르메스 LIFE
[String] Annotation기반 컨트롤러에 custom argument 적용하기 (WebArgumentResolver) 본문
Spring Framework
[String] Annotation기반 컨트롤러에 custom argument 적용하기 (WebArgumentResolver)
헤르메스의날개 2012. 3. 16. 20:36728x90
Method의 Argument를 자동으로 정의할 수 있도록 만들어주는 Class입니다.
원문 : http://ultteky.egloos.com/10525814
WebArgumentResolver 재밌는 인터페이스 발견..
뭐 대충 이런식.. 실행시 필요한 값들을 메소드에 박아두니
일일이 request.getParamter로 불러올 필요가 없어져서 좀 더 깔끔해졌다.
일반적으로 Annotation기반 Controller의 메소드에서 사용가능한 타입이 아닌
String 타입이나 UserDetails(Spring Security) 클래스가 사용되었다.
이걸 지원하기 위해 WebArgumentResolver 를 구현한 클래스를 작성하고..
이렇게 등록하면 된다.
참 쉽다;
원문 : http://ultteky.egloos.com/10525814
WebArgumentResolver 재밌는 인터페이스 발견..
SPI for resolving custom arguments for a specific handler method parameter.
Typically implemented to detect sppecial parameter types, resolving well-known argument values for them.
뭐 대충 이런식.. 실행시 필요한 값들을 메소드에 박아두니
일일이 request.getParamter로 불러올 필요가 없어져서 좀 더 깔끔해졌다.
@RequestParam(value="/send/message/to/{receiver}", params="message")
@Secured("ROLE_USER")
public void sendMessage(UserDetails me, String receiver, String message) throws Exception {
messagingService.sendMessage(me.getUsername(), receiver, message);
}
@Secured("ROLE_USER")
public void sendMessage(UserDetails me, String receiver, String message) throws Exception {
messagingService.sendMessage(me.getUsername(), receiver, message);
}
일반적으로 Annotation기반 Controller의 메소드에서 사용가능한 타입이 아닌
String 타입이나 UserDetails(Spring Security) 클래스가 사용되었다.
이걸 지원하기 위해 WebArgumentResolver 를 구현한 클래스를 작성하고..
public class RestfulArgumentResolver implements WebArgumentResolver {
public Object resolveArgument(MethodParameter param, NativeWebRequest req) {
Class<?> type = param.getParameterType();
Method method = param.getMethod();
if (type.equals(UserDetails.class)) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && !auth.getName().equals("anonymous")) {
return auth.getPrincipal();
}
}
else if (type.equals(String.class)) {
HttpServletRequest request = (HttpServletRequest) req.getNativeRequest();
String name = param.getParameterName();
Object value = request.getParameter(name);
if (value != null) {
return value;
}
}
return UNRESOLVED;
}
}
public Object resolveArgument(MethodParameter param, NativeWebRequest req) {
Class<?> type = param.getParameterType();
Method method = param.getMethod();
if (type.equals(UserDetails.class)) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && !auth.getName().equals("anonymous")) {
return auth.getPrincipal();
}
}
else if (type.equals(String.class)) {
HttpServletRequest request = (HttpServletRequest) req.getNativeRequest();
String name = param.getParameterName();
Object value = request.getParameter(name);
if (value != null) {
return value;
}
}
return UNRESOLVED;
}
}
이렇게 등록하면 된다.
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="customArgumentResolvers">
<list>
<bean class="kr.steelheart.support.web.RestfulWebArgumentResolver" />
</list>
</property>
</bean>
<property name="customArgumentResolvers">
<list>
<bean class="kr.steelheart.support.web.RestfulWebArgumentResolver" />
</list>
</property>
</bean>
참 쉽다;
728x90
'Spring Framework' 카테고리의 다른 글
[Spring] 템플릿과 스프링 - Whiteship's Epril (0) | 2012.03.17 |
---|---|
[Spring] 테스트와 스프링 - Whiteship's Epril (0) | 2012.03.17 |
[Spring] @ExceptionHandler과 SimpleMappingExceptionResolver 병행해서 사용하기 (0) | 2012.03.12 |
[Spring] 스프링MVC – 개괄 (0) | 2012.03.12 |
[DataSource] org.apache.commons.dbcp.BasicDataSource Connection Pool 설정 (0) | 2012.02.23 |