问题描述:

今天项目中需要实现对各个菜单访问记录日志的功能,所以先编写了 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{
     //代码正文
     ...
}

总结

所以,遇到问题不要慌,不要怕,万事万物都有一定的规律,总是会有解决方法的,你遇到的问题其他人早就遇到了,不一定完全相同,但一定会有相似的,百度一下,你想要的都有,不断的试错并找到最适合的,整合优化再记录下,方便自己也方便他人

如果仍未解决,欢迎留言交流

更多推荐

【问题来了】Spring项目启动出现 No bean named ‘xxx‘ available 的问题