2012-09-10 80 views
3

我试图从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> 

回答

6

的API已经与Spring 3.1改变 - 实现接口,以解决控制器参数是HandlerMethodArgumentResolver。您可以继续使用CustomWebArgumentResolver,通过adapting到一个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

+0

感谢您指出API更改。我已将CustomWebArgumentResolver从WebArgumentResolver的实现转换为HandlerMethodArgumentResolver的实现(如您的)。 添加大量日志记录后,似乎它正在完成其工作,但Controller仍然设置为空Date(!)。这就像参数被正确映射到处理程序,但没有在控制器上设置。 因此,有关这方面的问题仍然无法解决...... – user311121

+0

事实上,在进一步的思考中,CustomWebArgumentResolver并没有通过任何日期字符串...只是空值。 在我的Controller的get()方法上需要ParamMappings,就在AsOf注释之前? – user311121

+0

但是,您正在从请求参数中获取'asOf',所以您遇到的问题是asOf参数存在,并且似乎也进入resolveArgument方法,但是在方法本身它是空的它是 –

相关问题