2014-06-23 57 views
4

我有一個簡單的類名爲BeaconDaoSpring @Repository註解不起作用,但@Service註釋會執行嗎?

 

    package za.co.idealize.dao.impl; 

    import java.util.List; 

    import org.hibernate.Query; 
    import org.hibernate.Session; 
    import org.hibernate.SessionFactory; 
    import org.hibernate.Transaction; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.beans.factory.annotation.Qualifier; 
    import org.springframework.stereotype.Service; 
    import org.springframework.transaction.annotation.Transactional; 

    import za.co.idealize.dao.BaseDao; 
    import za.co.idealizeit.model.Beacon; 

    @Service("beaconDao") 
    public class BeaconDao extends BaseDao{ 

     @Autowired 
     protected BeaconDao(@Qualifier("sessionFactory") SessionFactory sessionFactory) { 
      super(sessionFactory, Beacon.class); 

     } 

     @Transactional(readOnly = true) 
     @SuppressWarnings("unchecked") 
     public List findByStoreID(int storeID) { 
      Session session = getSession(); 

      Transaction tx = session.beginTransaction(); 
      Query q = session.createQuery(
        "FROM Beacon b where b.storeId = :id"); 
      q.setParameter("id",storeID); 

      List beacon = q.list(); 

      tx.commit(); 
      return beacon; 
     } 

     @SuppressWarnings("unchecked") 
     public List findByUUID(String UUID) { 
      Session session = getSession(); 

      Transaction tx = session.beginTransaction(); 

      List beacon = session.createQuery(
        "FROM Beacon where Beacon.Uuid = " + UUID).list(); 
      tx.commit(); 
      return beacon; 
     } 

    } 

每當我開始我的應用程序了與beaconDAO標記@Repository應用回來與以下堆棧跟蹤:

 

    SEVERE: Context initialization failed 
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0' defined in class path resource [application-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beaconJsonController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao; nested exception is java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4961) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
     at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
     at java.lang.Thread.run(Thread.java:695) 
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beaconJsonController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao; nested exception is java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973) 
     at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:287) 
     at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:266) 
     at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.detectHandlers(AbstractDetectingUrlHandlerMapping.java:82) 
     at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:58) 
     at org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:120) 
     at org.springframework.web.context.support.WebApplicationObjectSupport.initApplicationContext(WebApplicationObjectSupport.java:73) 
     at org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:74) 
     at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:119) 
     at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:94) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:407) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1545) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
     ... 21 more 
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao; nested exception is java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 
     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
     ... 41 more 
    Caused by: java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 
     at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) 
     at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) 
     at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) 
     at java.lang.reflect.Field.set(Field.java:657) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504) 
     ... 43 more 
    Jun 24, 2014 1:30:46 AM org.apache.catalina.core.StandardContext listenerStart 
    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0' defined in class path resource [application-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beaconJsonController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao; nested exception is java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4961) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
     at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
     at java.lang.Thread.run(Thread.java:695) 
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beaconJsonController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao; nested exception is java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973) 
     at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:287) 
     at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:266) 
     at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.detectHandlers(AbstractDetectingUrlHandlerMapping.java:82) 
     at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:58) 
     at org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:120) 
     at org.springframework.web.context.support.WebApplicationObjectSupport.initApplicationContext(WebApplicationObjectSupport.java:73) 
     at org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:74) 
     at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:119) 
     at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:94) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:407) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1545) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
     ... 21 more 
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: public za.co.idealize.dao.impl.BeaconDao za.co.idealize.controller.BeaconJsonController.beaconDao; nested exception is java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 
     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
     ... 41 more 
    Caused by: java.lang.IllegalArgumentException: Can not set za.co.idealize.dao.impl.BeaconDao field za.co.idealize.controller.BeaconJsonController.beaconDao to com.sun.proxy.$Proxy30 
     at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) 
     at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) 
     at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) 
     at java.lang.reflect.Field.set(Field.java:657) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504) 
     ... 43 more 

然而

當我慶祝使用@Service或@Component的beaconDao一切正常。 任何人都可以在這裏看到一個問題?

+5

您確定您使用的是'org.springframework.stereotype.Repository'嗎?你可以用@Repository註解來發布你的配置和代碼(包括導入)嗎? –

+0

@KevinBowersox我的直覺是一樣的。 OP,請注意,此處的根錯誤是'無法將za.co.idealize.dao.impl.BeaconDao字段za.co.idealize.controller.BeaconJsonController.beaconDao設置爲com.sun.proxy $ Proxy30' – drewmoore

+0

您正在使用AOP在你的應用程序中? – davioooh

回答

6

的問題在於完全在別處:

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

,如果我是那意思就是英文,然後翻譯是:春天不能設置za.co.idealize.controller.BeaconJsonController單beaconDao字段,因爲JDK代理的使用和已宣佈BeaconJsonController.beaconDao作爲BeaconDao類時,你應該用某種接口。我懷疑你的BeaconDao類層次結構看起來有點像BeaconDao - >BaseDao - >ISomeDao,其中ISomeDao是一個接口。從

private BeaconDao beaconDao; 

更改BeaconJsonController的聲明

private ISomeDao beaconDao; 

,如果你必須使用限定詞。 問題是,Spring將爲ISomeDao接口創建代理,而不是爲BeaconDao,然後您嘗試將ISomeDao代理分配給BeaconDao字段,從而導致類別轉換異常。

+0

嘿,謝謝你的回答,當我使用一個界面時它就起作用了。我仍然不清楚爲什麼'@Service'和'@Component'與一個具體的類一起工作,但'@Repository'與這個接口一起工作。我的印象是'@service'和'@conponent'只是'@Component'註釋的子註釋 – Moejoejoejoe

+0

@dimoniy,嗨,你的回答解決了我的項目的一個巨大問題。謝謝你。但是如果你可以解釋一下,「當你使用某種接口時,你已經將BeaconJsonController.beaconDao聲明爲BeaconDao類」,這意味着,這很棒。爲什麼我需要使用接口而不是類本身? –

+1

@SajibAcharya Spring使用兩種代理:JDK代理和CGLIB代理。 JDK代理只能用於接口,所以當你通過spring創建任何類型的對象並且使用JDK代理時,Spring只能識別和連接接口。 – dimoniy