java - 在 Spring MVC 中无法从单独的服务包中找到 bean
问题描述
我得到的错误是NoSuchBeanDefinitionException,我有一个 Web 应用程序,我目前正在开发它以集成一些数据库功能。我的结构如下
domain.mainpackage
+ControllerClass
+SomeOtherClass
domain.DAOpackage
+someDAOClass
+someDAOimpl
domain.service
+MainService
+MainServiceImpl
我遇到的问题是控制器在构建应用程序时找不到 MainServiceClass 的 bean(请参阅下面的错误)
Nov 22, 2018 11:43:01 AM org.apache.catalina.core.ApplicationContext log
SEVERE: StandardWrapper.Throwable
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'applicationController': Unsatisfied dependency expressed through field 'mainService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'domain.service.MainService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1272)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:171)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1124)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1079)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:971)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4829)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5143)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3716)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292)
at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5465)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1396)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1400)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1400)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1368)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'domain.service.MainService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 33 more
我已将我的实现类注释为@Service
@Service
public class MainServiceImpl implements someDAOClass{
@Autowired
private someDAOClass someDAOClass1;
@Transactional
public list<someDAOClass> getSomeDAOClass(){
//return statement here
}
}
此外,我的 DAO 类被注释为@Repository,非事务性的。昨天我只使用 DAO 就达到了预期的结果,但现在我做了一些更改,我不确定为什么它不能一起工作。
我曾尝试在我的控制器上使用@ComponentScan,以防万一,但那是徒劳的。当我使用 STS(Eclipse) 时,我似乎无法创建一个根包并将控制器保留在那里,作为另一个 SO 帖子中的解决方案。因此,我正在寻找除了在系统资源管理器中更改架构之外的其他解决方案。
解决方案
您的服务实现类应该实现Service而不是 DAO
@Service
public class MainServiceImpl implements MainService {
您应该定义您的 bean,例如:
@Bean
public MainService mainService(){
return new MainServiceImpl ();
}
推荐阅读
- php - php_mysql 已禁用,为什么我仍然收到 mysql_connect() 错误?
- javascript - 如何使用类似选择器模式的 jquery 选择多个类选择器
- javascript - Material-UI:网格内的全宽列表
- excel - 返回最大数字行中的文本的公式
- python - 从 t-SNE 图中获取 ID?
- java - JAVA根据早期ID插入具有多行的多个表
- google-chrome - 如何将 Chrome.alarms.create 中的闹钟设置为每天运行一次?
- google-chrome-extension - 从命令行启动时,Chromium 不会启动扩展
- java - 如何在 Java 中的多个实现类中使用双接口?
- apache-spark - PySpark:将数据拉到驱动程序,然后上传到数据帧