我试图从3.0.6升级到3.1.2的春天MVC应用程序和一些曾经工作的控制器似乎不再工作。我已经阅读了春季文档,但我对什么是兼容性感到困惑。升级到spring-3.1似乎打破了我的CustomWebArgumentResolver
我们有一个CustomWebArgumentResolver,它查找名为“asOf”的任何请求参数并将其值转换为日期。我们称之为“AsOfDateConverter”。当升级到弹簧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>
感谢您指出API更改。我已将CustomWebArgumentResolver从WebArgumentResolver的实现转换为HandlerMethodArgumentResolver的实现(如您的)。 添加大量日志记录后,似乎它正在完成其工作,但Controller仍然设置为空Date(!)。这就像参数被正确映射到处理程序,但没有在控制器上设置。 因此,有关这方面的问题仍然无法解决...... – user311121
事实上,在进一步的思考中,CustomWebArgumentResolver并没有通过任何日期字符串...只是空值。 在我的Controller的get()方法上需要ParamMappings,就在AsOf注释之前? – user311121
但是,您正在从请求参数中获取'asOf',所以您遇到的问题是asOf参数存在,并且似乎也进入resolveArgument方法,但是在方法本身它是空的它是 –