升级到spring-3.1似乎打破了我的CustomWebArgumentResolver

时间:2012-09-10 18:58:33

标签: spring spring-mvc

我正在尝试将spring MVC应用程序从3.0.6升级到3.1.2,并且一些以前工作的控制器似乎不再起作用了。我已经阅读了春季文档,但我对什么与什么兼容感到困惑。

我们有一个CustomWebArgumentResolver,它查找名为“asOf”的任何请求参数,并将其值转换为日期。我们称之为“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”参数为空,我确定我错过了一些明显的东西。如果有人在最​​新的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 个答案:

答案 0 :(得分:6)

随着Spring 3.1改变了API - 用于解析控制器参数的实现接口是HandlerMethodArgumentResolver。您可以继续CustomWebArgumentResolver adapting使用https://gist.github.com/3703430到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注释,你可能还没有宣布Runtime的保留,这可能是WebArgumentResolver没有生效的原因:

@Retention(RetentionPolicy.RUNTIME)
public @interface AsOf {

}

无论如何,这里有一个完整的工作测试的要点:

{{3}}