Spring 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になり、明らかな何かが欠落していると確信しています。最新のMVC3.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>