2011-08-07 8 views
16

Mam dwóch klas usług, które realizują ten sam interfejs

ServiceClass1

@Service 
public class ServiceClass1 implements ItemsService{ 

@Autowired 
Class1DaoImpl class1Dao; 

@Transactional 
public List<Class1> getAllItems() { 
    return class1Dao.getAllItems(); 

} 

ServiceClass2

@Service 
public class ServiceClass2 implements ItemsService{ 

@Autowired 
Class2DaoImpl class2Dao; 

@Transactional 
public List<Class2> getAllItems() { 
    return class2Dao.getAllItems(); 

} 

I to jest klasa kontrolera

 @Controller 
    public class IndexController { 


    @Autowired 
    ServiceClass1 serviceClass1; 

    @Autowired 
    ServiceClass1 serviceClass2;  

     ............ 
     ..... 
} 

mam ten błąd, gdy strona została wezwana

java.lang.IllegalArgumentException: Can not set com.package.ServiceClass1 field com.package.IndexController.serviceClass1 to $Proxy25 
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:500) 
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) 
org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:609) 
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:571) 
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:623) 
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:491) 
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:432) 
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133) 
javax.servlet.GenericServlet.init(GenericServlet.java:212) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
java.lang.Thread.run(Thread.java:662) 

Zrobiłem kilka google-ing i nie wydaje się znaleźć wszelkie stałe odpowiedź dlaczego otrzymuję ten błąd?

Odpowiedz

41

Trzeba autowire przeciwko typ interfejsu, nie jest typem klasy, tj

@Autowired 
ItemsService serviceClass1; 

Jeśli masz wiele ziaren, które implementują ItemsService, następnie autowiring naprawdę nie jest właściwe. Rozważyć użycie @Resource zamiast:

@Resource(name="serviceClass1") 
ItemsService serviceClass1; 

@Resource(name="serviceClass2") 
ItemsService serviceClass1; 
+0

@skaffman .. więc gdzie mogę podać nazwiska fasoli zasób? Chodzi mi o to, że nie deklaruję fasoli Service w pliku xml lub przynajmniej ja uważałem, że nie jest to konieczne, ponieważ używałem "skanu komponentu" .. bez wyraźnego deklarowania w pliku konfiguracyjnym komponentu bean, jak mają nazwy "serviceClass1" "i" serviceClass2 "zostały rozwiązane? – RKodakandla

+0

@rrkwells: Nazwy komponentów bean są wywnioskowane na podstawie nazw klas (na przykład 'com.x.y.ServiceClass1' =>' serviceClass1'. – skaffman

+2

Naprawdę nie podoba mi się to podejście - jak to się dzieje, jeśli nazwa klasy się zmieni? – Dejell

Powiązane problemy