问题描述:
今天项目中需要实现对各个菜单访问记录日志的功能,所以先编写了 MenuAccessLogService 服务类,用于保存日志数据到数据库中,然后在类似AuthFilter类(权限过滤器)中引入 MenuAccessLogService,当然这里可以提一下,在AuthFilter类中是无法通过注解方式注入bean的,而是采用另外一种方式,在 init 方法中加入以下代码即可完成注入:
//注入service
ServletContext sc = filterConfig.getServletContext();
WebApplicationContext cxt = WebApplicationContextUtils.getWebApplicationContext(sc);
if (cxt != null && cxt.getBean("menuAccessLogService")!= null && menuAccessLogService== null ) {
menuAccessLogService= (MenuAccessLogService) cxt.getBean("menuAccessLogService");
}
接着在 doFilter 方法中 进行对 request.getRequestURI()(此uri即为请求路径,与数据库菜单表对比后就可以判断是否为菜单) 调用menuAccessLogService中保存方法进行保存。当一顿操作后,感觉万事已完备,只待启动,结果不料,报错了:No bean named ‘menuAccessLogService’ available
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'menuAccessLogService' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:686)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1089)
at cn.itcast.cdcenter.conf.filter.AuthFilter.init(AuthFilter.java:52)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:112)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4637)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5282)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1421)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1411)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
解决方案:
1、服务类 MenuAccessLogService 的注解 @Service 的包引错了:
//错误引入
import com.alibaba.dubbo.config.annotation.Service
而应该是:
//正确引入
import org.springframework.stereotype.Service
所以遇到类似的问题,先看看是不是包引入错误,待修改后再启动看看,如果仍然报错,就试试下一个解决方案
2、在 @Service 注解 后加上名称,如:@Service(“menuAccessLogService”)
@Service("menuAccessLogService")
public class MenuAccessLogService{
//代码正文
...
}
总结
所以,遇到问题不要慌,不要怕,万事万物都有一定的规律,总是会有解决方法的,你遇到的问题其他人早就遇到了,不一定完全相同,但一定会有相似的,百度一下,你想要的都有,不断的试错并找到最适合的,整合优化再记录下,方便自己也方便他人
如果仍未解决,欢迎留言交流