[SPRING] spring-3.1로 업그레이드하면 내 사용자 정의 WebArgumentResolver가 손상되는 것 같습니다.
SPRINGspring-3.1로 업그레이드하면 내 사용자 정의 WebArgumentResolver가 손상되는 것 같습니다.
나는 봄 MVC 애플 리케이션을 3.0.6에서 3.1.2로 업그레이드하려고 노력 중이며 작동하던 일부 컨트롤러는 더 이상 작동하지 않는 것으로 보인다. 스프링 문서를 읽었지만 무엇이 호환되는지 혼동합니다.
"asOf"라는 요청 매개 변수를 찾고 해당 값을 날짜로 가리키는 CustomWebArgumentResolver가 있습니다. 우리는이를 상상력을 넘어서서 "AsOfDateConverter"라고 부릅니다. spring-3.1.2로 업그레이드 할 때 새로운 네임 스페이스 기능을 활용하여이를 applicationContext에 추가했습니다.
<mvc:annotation-driven conversion-service="conversionService">
<mvc:argument-resolvers>
<bean id="customWebArgumentResolver" class="my.converters.CustomWebArgumentResolver">
</bean>
</mvc:argument-resolvers>
</mvc:annotation-driven>
CustomWebArgumentResolver는 간단합니다.
public class CustomWebArgumentResolver implements WebArgumentResolver {
private AsOfDateConverter asOfDateConverter;
@Override
public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
if (isAsOfDateParameter(methodParameter)) {
return asOfDateConverter.convert(webRequest.getParameter("asOf"));
}
return UNRESOLVED;
}
그런 다음 예제 컨트롤러는 다음과 같이 보일 수 있습니다.
@Controller
@Secured({BaseController.ROLE_LOGGED_IN})
@org.springframework.transaction.annotation.Transactional
public class DashboardController extends BaseController {
public static final String URL = "/dashboard";
@RequestMapping(value=URL, method=RequestMethod.GET)
public ModelAndView get(@RequestParam(required=false) String requestedMeterType, @AsOf Date asOf) {
debug(log, "Rendering dashboard asOf %s", asOf);
etc etc
"asOf"매개 변수가 null로 들어오고 있으며 확실한 것이 빠져있을 것이라고 확신합니다. 거기에 누구든지 최신 MVC 3.1에 깊은 목숨이 옳은 방향으로 나를 가리킬 수 있다면 나는 감사 할 것입니다.
감사! 남자 이름
편집 : AsOf 주석 :
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface AsOf {
}
내 applicationContext의 더보기 :
<mvc:annotation-driven conversion-service="conversionService">
<mvc:argument-resolvers>
<bean class="[blah].AsOfDateHandlerMethodArgumentResolver">
<property name="asOfDateConverter">
<bean class="[blah].AsOfDateConverter"/>
</property>
</bean>
</mvc:argument-resolvers>
</mvc:annotation-driven>
<!-- Added to re-support @Controller annotation scanning after upgrading to spring-3.1. -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="[blah].converters.CustomerConverter"/>
<bean class="[blah].converters.AccountConverter"/>
<bean class="[blah].converters.DateConverter"/>
<bean class="[blah].converters.CustomerCommunicationInstanceConverter"/>
<bean class="[blah].converters.MeterTypeConverter"/>
<bean class="[blah].converters.AreaAmountConverter" p:precision="0"/>
<bean class="[blah].converters.LengthAmountConverter" p:precision="1"/>
</set>
</property>
</bean>
해결법
-
==============================
1.Spring 3.1에서 API가 변경되었습니다. 컨트롤러 인수를 해결하기 위해 구현할 인터페이스는 HandlerMethodArgumentResolver입니다. CustomWebArgumentResolver를 HandlerMethodArgumentResolver에 적용하여 계속 사용할 수 있습니다.
Spring 3.1에서 API가 변경되었습니다. 컨트롤러 인수를 해결하기 위해 구현할 인터페이스는 HandlerMethodArgumentResolver입니다. CustomWebArgumentResolver를 HandlerMethodArgumentResolver에 적용하여 계속 사용할 수 있습니다.
HandlerMethodArgumentResolver를 사용하도록 코드를 변경하는 것도 쉽습니다.
public class CustomWebArgumentResolver implements HandlerMethodArgumentResolver { private AsOfDateConverter asOfDateConverter; @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { if (isAsOfDateParameter(methodParameter)) { return asOfDateConverter.convert(webRequest.getParameter("asOf")); } return UNRESOLVED; } @Override public boolean supportsParameter(MethodParameter parameter) { return (methodParameter.getParameterAnnotation(AsOf.class)!=null) }
편집하다
귀하의 의견을 살펴본 후에 나는 무엇이 잘못 될 수 있는지에 대해 생각해 보았습니다. @AsOf 주석을 확인해 주시겠습니까? 아마도 WebArgumentResolver가 적용되지 않는 이유가 될 수있는 런타임 보존을 선언하지 않았을 것입니다.
@Retention(RetentionPolicy.RUNTIME) public @interface AsOf { }
어쨌든 여기에 같은 줄을 따라 완전한 작동 테스트를하는 요지가 있습니다 :
https://gist.github.com/3703430
from https://stackoverflow.com/questions/12357817/upgrading-to-spring-3-1-seems-to-break-my-customwebargumentresolver by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 클라이언트 비밀없이 Spring OAuth2 서버로부터 access_token을 얻을 수 있습니까? (0) | 2019.02.12 |
---|---|
[SPRING] 어쨌든 @ Inject / @ Autowire로 내부 클래스를 외부 클래스에 넣으시겠습니까? (0) | 2019.02.12 |
[SPRING] @ResponseBody 주석을 사용할 때의 빈 문자열로서의 널 값 (0) | 2019.02.12 |
[SPRING] Maven 인덱스 재구성 0 %에서 멈춤 (0) | 2019.02.12 |
[SPRING] REST 컨트롤러는 멀티 스레드입니까? (0) | 2019.02.12 |