gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:31:58 25 4
gpt4 key购买 nike

我正在尝试将 Spring MVC 应用程序从 3.0.6 升级到 3.1.2,一些曾经可以工作的 Controller 似乎不再工作了。我已经阅读了 spring 文档,但我对什么与什么兼容感到困惑。

我们有一个 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 可能如下所示:

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

最佳答案

Spring 3.1 中的 API 发生了变化 - 实现解析 Controller 参数的接口(interface)是 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注释,您可能没有声明保留Runtime,这可能是WebArgumentResolver不生效的原因:

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

}

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

https://gist.github.com/3703430

关于spring - 升级到 spring-3.1 似乎破坏了我的 CustomWebArgumentResolver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12357817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com