일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- WebApplicationInitializer
- KSUG
- ServletContextInitializer
- devtools
- elasticache
- OAuth2.0
- Spring Security OAuth
- spring cloud
- 데브툴즈
- 스프링시큐리티
- spring security
- 스프링 부트
- spring boot 1.3
- 인텔리J
- mybatis
- Fiilter
- spring cloud config
- spring test mvc
- 스프링
- spring boot mybatis
- Spring MVC
- spring boot devtools
- spring
- OAuth 2.0
- apache thrift
- Spring Boot
- spring-mybatis
- @MVC
- spring camp
- Multi DataSource
- Today
- Total
홍이의 개발 노트
Spring3 @MVC 사용 했을 때 매개변수 타입별 리턴되는 객체 본문
@MVC가 어떻게 움직이는지 궁금 해서 소스를 보고 있는 중에 매개변수 타입에 따라 리턴 되는 객체를 컨트롤 하는 부분을 찾았다.
AnnotationMethodHandlerAdapter 클래스 파일 안에 ServletHandlerMethodInvoker 이라는 클래스 안에서 resolveStandardArgument의 이 메소드 안에서 이부분을 찾았다.
@Override
protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
if (ServletRequest.class.isAssignableFrom(parameterType) ||
MultipartRequest.class.isAssignableFrom(parameterType)) {
Object nativeRequest = webRequest.getNativeRequest(parameterType);
if (nativeRequest == null) {
throw new IllegalStateException(
"Current request is not of type [" + parameterType.getName() + "]: " + request);
}
return nativeRequest;
}
else if (ServletResponse.class.isAssignableFrom(parameterType)) {
this.responseArgumentUsed = true;
Object nativeResponse = webRequest.getNativeResponse(parameterType);
if (nativeResponse == null) {
throw new IllegalStateException(
"Current response is not of type [" + parameterType.getName() + "]: " + response);
}
return nativeResponse;
}
else if (HttpSession.class.isAssignableFrom(parameterType)) {
return request.getSession();
}
else if (Principal.class.isAssignableFrom(parameterType)) {
return request.getUserPrincipal();
}
else if (Locale.class.equals(parameterType)) {
return RequestContextUtils.getLocale(request);
}
else if (InputStream.class.isAssignableFrom(parameterType)) {
return request.getInputStream();
}
else if (Reader.class.isAssignableFrom(parameterType)) {
return request.getReader();
}
else if (OutputStream.class.isAssignableFrom(parameterType)) {
this.responseArgumentUsed = true;
return response.getOutputStream();
}
else if (Writer.class.isAssignableFrom(parameterType)) {
this.responseArgumentUsed = true;
return response.getWriter();
}
return super.resolveStandardArgument(parameterType, webRequest);
}
HandlerMethodInvoker.class
protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
if (WebRequest.class.isAssignableFrom(parameterType)) {
return webRequest;
}
return WebArgumentResolver.UNRESOLVED;
}
대충 요약 해보면
매개변수 타입 | 리턴되는 객체 |
ServletRequest.class, MultipartRequest.class | webRequest.getNativeRequest(parameterType); |
ServletResponse.class | webRequest.getNativeResponse(parameterType); |
HttpSession.class | request.getSession(); |
Principal.class | request.getUserPrincipal(); |
Locale.class | RequestContextUtils.getLocale(request); |
InputStream.class | request.getInputStream(); |
Reader.class | request.getReader(); |
OutputStream.class | response.getOutputStream(); |
Writer.class | response.getWriter(); |
WebRequest.class | NativeWebRequest |
HandlerMethodInvoker 클래스를 상속하여 ServletHandlerMethodInvoker 클래스에서 구현 하고 있으며
AnnotationMethodHandlerAdapter.class를 사용 했을 시에 기본으로 지원하는 타입별 리턴되는 객체 정보이다.
후에는 Annotation에 따라 리턴하는 부분도 살펴 봐야 겠다.