Spring @Repository 注释不起作用,但 @Service 注释起作用?

Posted

技术标签:

【中文标题】Spring @Repository 注释不起作用,但 @Service 注释起作用?【英文标题】:Spring @Repository annotation does not work but @Service annotation does? 【发布时间】:2014-08-14 02:25:09 【问题描述】:

我有一个名为 BeaconDao 的简单类

包 za.co.idealize.dao.impl; 导入 java.util.List; 导入 org.hibernate.Query; 导入 org.hibernate.Session; 导入 org.hibernate.SessionFactory; 导入 org.hibernate.Transaction; 导入 org.springframework.beans.factory.annotation.Autowired; 导入 org.springframework.beans.factory.annotation.Qualifier; 导入 org.springframework.stereotype.Service; 导入 org.springframework.transaction.annotation.Transactional; 导入 za.co.idealize.dao.BaseDao; 导入 za.co.idealizeit.model.Beacon; @Service("beaconDao") 公共类 BeaconDao 扩展 BaseDao @自动连线 受保护的 BeaconDao(@Qualifier("sessionFactory") SessionFactory sessionFactory) 超级(会话工厂,Beacon.class); @Transactional(readOnly = true) @SuppressWarnings("未选中") 公共列表 findByStoreID(int storeID) 会话会话 = getSession(); 交易 tx = session.beginTransaction(); 查询 q = session.createQuery( "来自信标 b,其中 b.storeId = :id"); q.setParameter("id",storeID); 列出信标 = q.list(); tx.commit(); 返回信标; @SuppressWarnings("未选中") 公共列表 findByUUID(字符串 UUID) 会话会话 = getSession(); 交易 tx = session.beginTransaction(); 列出信标 = session.createQuery( "来自 Beacon,其中 Beacon.Uuid = " + UUID).list(); tx.commit(); 返回信标;

每当我使用标记为@Repository 的beaconDAO 启动我的应用程序时,应用程序都会返回以下堆栈跟踪:

严重:上下文初始化失败 org.springframework.beans.factory.BeanCreationException:在类路径资源[application-context.xml]中定义名称为“org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0”的bean创建错误:bean初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“beaconJsonController”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao;嵌套异常是 java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4961) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 在 java.lang.Thread.run(Thread.java:695) 原因:org.springframework.beans.factory.BeanCreationException:创建名为“beaconJsonController”的bean时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao;嵌套异常是 java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973) 在 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:287) 在 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:266) 在 org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.detectHandlers(AbstractDetectingUrlHandlerMapping.java:82) 在 org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:58) 在 org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:120) 在 org.springframework.web.context.support.WebApplicationObjectSupport.initApplicationContext(WebApplicationObjectSupport.java:73) 在 org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:74) 在 org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:119) 在 org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:94) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:407) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1545) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) ... 21 更多 引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao;嵌套异常是 java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 41 更多 引起:java.lang.IllegalArgumentException:无法将 za.co.idealize.dao.impl.BeaconDao 字段 za.co.idealize.controller.BeaconJsonController.beaconDao 设置为 com.sun.proxy.$Proxy30 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException (UnsafeFieldAccessorImpl.java:146) 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException (UnsafeFieldAccessorImpl.java:150) 在 sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) 在 java.lang.reflect.Field.set(Field.java:657) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504) ... 43 更多 2014 年 6 月 24 日上午 1:30:46 org.apache.catalina.core.StandardContext listenerStart 严重:向 org.springframework.web.context.ContextLoaderListener 类的侦听器实例发送上下文初始化事件的异常 org.springframework.beans.factory.BeanCreationException:在类路径资源[application-context.xml]中定义名称为“org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0”的bean创建错误:bean初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“beaconJsonController”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao;嵌套异常是 java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4961) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 在 java.lang.Thread.run(Thread.java:695) 原因:org.springframework.beans.factory.BeanCreationException:创建名为“beaconJsonController”的bean时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao;嵌套异常是 java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973) 在 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:287) 在 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:266) 在 org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.detectHandlers(AbstractDetectingUrlHandlerMapping.java:82) 在 org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:58) 在 org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:120) 在 org.springframework.web.context.support.WebApplicationObjectSupport.initApplicationContext(WebApplicationObjectSupport.java:73) 在 org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:74) 在 org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:119) 在 org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:94) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:407) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1545) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) ... 21 更多 引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao;嵌套异常是 java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 41 更多 引起:java.lang.IllegalArgumentException:无法将 za.co.idealize.dao.impl.BeaconDao 字段 za.co.idealize.controller.BeaconJsonController.beaconDao 设置为 com.sun.proxy.$Proxy30 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException (UnsafeFieldAccessorImpl.java:146) 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException (UnsafeFieldAccessorImpl.java:150) 在 sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) 在 java.lang.reflect.Field.set(Field.java:657) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504) ... 43 更多

但是,当我使用 @Service 或 @Component 标记 beaconDao 时,一切正常。 任何人都可以在这里看到问题吗?

【问题讨论】:

您确定您使用的是org.springframework.stereotype.Repository吗?您可以使用 @Repository 注释发布您的配置和代码(包括导入)吗? @KevinBowersox 我的直觉是一样的。 OP,注意这里的根错误是Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 你在你的应用程序中使用 AOP 吗? 非常感谢您的回复。我没有使用 AOP,但是我发现以下答案很有帮助。我仍然不清楚为什么 'code'@Respository'code' 在不使用接口的情况下不起作用,但 'code'@service'code' 和 'code'@component'code' 注释允许您使用具体类。 【参考方案1】:

问题完全出在其他地方:

Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30

现在,如果我将其翻译成英文,那么翻译将是:Spring 无法在 za.co.idealize.controller.BeaconJsonController 单例上设置 beaconDao 字段,因为使用了 JDK 代理,并且您已将 BeaconJsonController.beaconDao 声明为应该使用的 BeaconDao 类某种界面。我怀疑您的 BeaconDao 类层次结构看起来像 BeaconDao -> BaseDao -> ISomeDao 其中 ISomeDao 是一个接口。将BeaconJsonController 中的声明从

private BeaconDao beaconDao; 

private ISomeDao beaconDao;

如果必须,请使用限定符。 问题是 Spring 将为 ISomeDao 接口而不是 BeaconDao 创建代理,然后您尝试将 ISomeDao 代理分配给导致类转换异常的 BeaconDao 字段。

【讨论】:

嘿,感谢您的回答,当我使用界面时它起作用了。我仍然不清楚为什么“@Service”和“@Component”与具体类一起工作,但“@Repository”与接口一起工作。我的印象是“@service”和“@conponent”只是“@Component”注释的子注释 @dimoniy,您好,您的回答为我的项目解决了一个大问题。谢谢你。但是,如果您可以解释“当您应该使用某种接口时,您已将 BeaconJsonController.beaconDao 声明为 BeaconDao 类”这意味着,那就太好了。为什么我需要使用接口而不是类本身? @SajibAcharya Spring 使用两种代理:JDK 代理和 CGLIB 代理。 JDK 代理只适用于接口,所以当你通过 spring 创建任何类型的对象并使用 JDK 代理时,Spring 只能识别和连接接口。

以上是关于Spring @Repository 注释不起作用,但 @Service 注释起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Spring @ComponentScan 注释不起作用

事务注释在 Spring Boot 中不起作用

Spring CORS 控制器注释不起作用

事务注释在 Spring Boot 2.1.3 中不起作用

Spring Data @CreatedDate 注释对我不起作用

IntelliJ Spring Gradle 项目注释不起作用