【发布时间】: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吗?
-
好的,你的配置中是否还有
<mvc:annotation-driven>- 如果有,AnnotationMethodHandlerAdapter 和通过<mvc:annotation-driven>注册的那个不能很好地协同工作,还有另一种方法来注册argumentresolver -
是的,我的 .xml 配置文件中有这一行。
-
那么有没有办法创建一些 bean 或方法,Spring 在初始化 bean 后会执行?这样我可以获取容器并从 java 代码中手动设置此属性?
-
我已经添加了一个答案,您能否看看它是否有帮助,如果您不清楚如何实现
HandlerMethodArgumentResolver,我可以将此信息添加到我的答案中。
标签: spring spring-mvc annotations