【问题标题】:Spring mvc - implementation of WebArgumentResolverSpring mvc - WebArgumentResolver 的实现
【发布时间】:2012-09-12 18:07:32
【问题描述】:

我想创建自定义控制器方法参数注释。

按照这个问题How to pass a session attribute as method argument (parameter) with Spring MVC 并按照@Bozho 的建议,我有这样的事情:

我的解析器

public class SessionAttributeAnnotationResolver implements WebArgumentResolver {

    public Object resolveArgument(MethodParameter parameter,
            NativeWebRequest request) throws Exception {
        System.out.println("I am here");
        Annotation[] parameterAnnotations = parameter.getParameterAnnotations();
        Class<?> parameterType = parameter.getParameterType();

        for (Annotation parameterAnnotation : parameterAnnotations) {
            if (SessionAttribute.class.isInstance(parameterAnnotation)) {
                SessionAttribute sessionAttribute = (SessionAttribute) parameterAnnotation;
                String parameterName = sessionAttribute.value();
                boolean required = sessionAttribute.required();
                HttpServletRequest httprequest = (HttpServletRequest) request
                        .getNativeRequest();
                HttpSession session = httprequest.getSession(false);
                Object result = null;
                if (session != null) {
                    result = session.getAttribute(parameterName);
                }
                if (result == null && required && session == null)
                    raiseSessionRequiredException(parameterName, parameterType);
                if (result == null && required)
                    raiseMissingParameterException(parameterName, parameterType);
                return result;
            }
        }
        return WebArgumentResolver.UNRESOLVED;
    }

    protected void raiseMissingParameterException(String paramName,
            Class<?> paramType) throws Exception {
        throw new IllegalStateException("Missing parameter '" + paramName
                + "' of type [" + paramType.getName() + "]");
    }

    protected void raiseSessionRequiredException(String paramName,
            Class<?> paramType) throws Exception {
        throw new HttpSessionRequiredException(
                "No HttpSession found for resolving parameter '" + paramName
                        + "' of type [" + paramType.getName() + "]");
    }
}

注释

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface SessionAttribute {
    String value();
    boolean required() default true;
}

简单的控制器来测试一切

@Controller
@RequestMapping("/test")
public class TestController {

    @RequestMapping(method= RequestMethod.GET)
    public String t(@SessionAttribute("userEntity") UserEntity e2,Model model,HttpServletRequest req){
        System.out.println(req.getSession().getId());
        UserEntity e=(UserEntity) req.getSession().getAttribute("userEntity");
        System.out.println(e.getName());
        System.out.println(e2.getName());
        return "login";
    }
}

最后是 Spring 配置

<beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">     
    <beans:property name="customArgumentResolver" ref="sessionAttributeAnnotationResolver"/>
</beans:bean>
<beans:bean id="sessionAttributeAnnotationResolver" class="pl.meble.taboret.utils.SessionAttributeAnnotationResolver"/>  

现在,在我看来一切都井井有条,但我可能犯了一些愚蠢的错误,因为当执行控制器时,我得到了

F0B282C93B74F8FA3F21A51F46D4D4D5
username
null

【问题讨论】:

  • 你能验证一下你使用的Spring版本-3.0.5吗?
  • 好的,你的配置中是否还有&lt;mvc:annotation-driven&gt; - 如果有,AnnotationMethodHandlerAdapter 和通过&lt;mvc:annotation-driven&gt; 注册的那个不能很好地协同工作,还有另一种方法来注册argumentresolver
  • 是的,我的 .xml 配置文件中有这一行。
  • 那么有没有办法创建一些 bean 或方法,Spring 在初始化 bean 后会执行?这样我可以获取容器并从 java 代码中手动设置此属性?
  • 我已经添加了一个答案,您能否看看它是否有帮助,如果您不清楚如何实现HandlerMethodArgumentResolver,我可以将此信息添加到我的答案中。

标签: spring spring-mvc annotations


【解决方案1】:

在 Spring 3.1.0 中,ArgumentResolver 现在已更改为 HandlerMethodArgumentResolver - 在此之前它曾经是 WebArgumentResolver - 相关答案是 here

一旦你编写了一个新的 HandlerMethodArgumentResolver,它与你当前的实现没有太大的不同,你可以这样注册它:

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean id="sessionAttributeAnnotationResolver" class="..SessionAttributeAnnotationResolver ">
        </bean>            
    </mvc:argument-resolvers>
</mvc:annotation-driven>

【讨论】:

  • 添加 XML 有助于注册我的解析器,但由于某种原因它仍然必须是 WebArgumentResolver。
猜你喜欢
  • 2013-12-13
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2015-10-09
  • 2020-05-20
  • 2014-09-06
  • 2010-12-15
  • 2013-02-23
相关资源
最近更新 更多