3

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>
4

1 に答える 1

6

API は Spring 3.1 で変更されました。コントローラーの引数を解決するために実装するインターフェースはHandlerMethodArgumentResolverです。HandlerMethodArgumentResolver に適応CustomWebArgumentResolverさせることで、引き続き使用できます

ただし、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

于 2012-09-10T19:40:42.800 に答える