[SPRING] Spring HandlerMethodArgumentResolver가 실행되지 않습니다.
SPRINGSpring HandlerMethodArgumentResolver가 실행되지 않습니다.
Spring MVC 3.2.2를 사용하고있다.
이처럼 사용자 정의 HandlerMethodArgumentResolver 클래스를 정의했습니다.
public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {
public CurrentUserArgumentResolver() {
System.out.println("Ready");
}
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(CurrentUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Principal principal = webRequest.getUserPrincipal();
System.out.println("*** Principal ***: " + principal);
return principal;
}
}
그리고 다음을 app-servlet.xml에 추가했습니다.
<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="my.package.CurrentUserArgumentResolver" lazy-init="false"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
CurrentUser에 대한 주석을 만들었습니다.
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
응용 프로그램을 시작할 때 로그 메시지 "Ready"가 표시 될 수 있지만 클래스 메서드 (@Controller annotation이있는 클래스)에 주석을 달면 해결자가 실행되지 않으므로 클래스가 생성됩니다.
@RequestMapping(method = RequestMethod.POST, value = "/update")
public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser Principal principal) {
...
}
CurrentUserArgumentResolver 클래스의 두 메서드 중 하나에 중단 점을 넣으면 둘 다 작동하지 않습니다. 그래서 내가 무엇을 놓치고 있는지 확실하지 않습니까?
해결법
-
==============================
1.스프링으로 추가 된 기본 핸들러에 대해 맞춤 핸들러의 우선 순위를 지정하려는 경우 @Configuration 파일에서이를 수행하는 스 니펫이 있습니다.
스프링으로 추가 된 기본 핸들러에 대해 맞춤 핸들러의 우선 순위를 지정하려는 경우 @Configuration 파일에서이를 수행하는 스 니펫이 있습니다.
private @Inject RequestMappingHandlerAdapter adapter; @PostConstruct public void prioritizeCustomArgumentMethodHandlers () { List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<> (adapter.getArgumentResolvers ()); List<HandlerMethodArgumentResolver> customResolvers = adapter.getCustomArgumentResolvers (); argumentResolvers.removeAll (customResolvers); argumentResolvers.addAll (0, customResolvers); adapter.setArgumentResolvers (argumentResolvers); }
-
==============================
2.좋습니다. Spring이 이미 위의 예제에서 Principal 객체를 해결하고 있으므로 내 인수 확인자가 시작되지 않았습니다. 나는 게으르며 @CurrentUser 주석을 기존 매개 변수에 추가했습니다.
좋습니다. Spring이 이미 위의 예제에서 Principal 객체를 해결하고 있으므로 내 인수 확인자가 시작되지 않았습니다. 나는 게으르며 @CurrentUser 주석을 기존 매개 변수에 추가했습니다.
그래서 나는 나의 예를 바꿨다.
@RequestMapping(method = RequestMethod.POST, value = "/update") public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser Principal principal) { ... }
내 사용자 모델 클래스 사용
@RequestMapping(method = RequestMethod.POST, value = "/update") public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser User user) { ... }
그리고 지금 그것은 작동합니다!
-
==============================
3.customArgumentResolvers 속성을 사용하여 다음과 같이 bean을로드합니다.
customArgumentResolvers 속성을 사용하여 다음과 같이 bean을로드합니다.
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/plain;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </list> </property> <property name="customArgumentResolvers"> <list> <bean id="MyTestMethodArgumentResolver" class="com.gst.authorization.resolvers.MyTestMethodArgumentResolver"></bean> <bean id="currentUserMethodArgumentResolver" class="com.gst.authorization.resolvers.CurrentUserMethodArgumentResolver"> <property name="userModelClass" value="com.gst.model.appuser.AppUser" /> <property name="userModelRepository" ref="userRepository" /> </bean> </list> </property> </bean> <mvc:annotation-driven />
from https://stackoverflow.com/questions/17331448/spring-handlermethodargumentresolver-not-executing by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 3.1에서 Jackson SerializationConfig.Feature 설정은 어디에 지정해야합니까? (0) | 2019.01.21 |
---|---|
[SPRING] Spring RestTemplate - ResponseErrorHandler 무시 (0) | 2019.01.21 |
[SPRING] 자바 커스텀 / 단순 태그에 스프링 관리 빈을 주입하는 우아한 방법이 있는가? (0) | 2019.01.21 |
[SPRING] Spring 보안이 인증 성공 후 default-target-url을 치지 않음 (0) | 2019.01.20 |
[SPRING] JPA 2.0에서 엔티티 자동 검색 방법 (0) | 2019.01.20 |