2019独角兽企业重金招聘Python工程师标准>>>
我就我遇到的自定义注解无法注入的问题整理一下:
1、遇到的问题
SpringMvc的注入式通过id去查找上下文,这种方式用起来非常好用,但是在使用自定义标签时遇到了问题,注入永远为空。这是为什么呢?
这是因为spring 注解注入@Autowired 前提是这个类被实例化,你自定义的标签只有在调用的时候 才会实例化的。
2、解决办法
1、 如果使用 Spring 的 MVC 包,则可以使用 RequestContextAwareTag 类。例:
public class AuthTag extends RequestContextAwareTag {
private IAuthService authService;
private String auth;
public String getAuth() {
return auth;
}
public void setAuth(String auth) {
this.auth = auth;
}
@Override
protected int doStartTagInternal() throws Exception {
boolean result = false;
String erp = LoginContext.getLoginContext().getPin();
authService = (IAuthService) this.getRequestContext().getWebApplicationContext().getBean("authService");
List list = authService.getByErp(erp);
for(SysAuth a:list){
if(auth.equals(a.getToken())){
result = true;
}
}
return result? EVAL_BODY_INCLUDE : SKIP_BODY;
}
}
2、没有使用Spring的Mvc包则建议使用以下方法:
/* 获取Spring上下文(以下代码可利用工具类进行包装) */
PageContext pageContext = (PageContext) this.getJspContext();
ServletContext servletContext = pageContext.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
/* 从上下文中获取指定的Bean */
IAuthService authService = (IAuthService) wac.getBean("authService");
/**
* 在Spring上下文中根据对象ID获取对象引用
*
* @param jspContext JSP上下文
* @param beanId 对象ID
* @return 对象引用
*/
@SuppressWarnings({"unchecked"})
public T getBean(JspContext jspContext, String beanId)
{
T bean = null;
PageContext pageContext = (PageContext) jspContext;
if (pageContext != null)
{
ServletContext servletContext = pageContext.getServletContext();
if (servletContext != null)
{
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
if (wac != null && wac.containsBean(beanId))
{
bean = (T) wac.getBean(beanId);
}
}
}
return bean;
}
3、结果
我使用了第一种方式,注入的问题完美解决,注意继承类不同时需要实现的方法也不一样。