2011-08-07 8 views
16

Tengo dos clases de servicios que implementan la misma interfaz

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(); 

} 

y esta es la clase controlador

 @Controller 
    public class IndexController { 


    @Autowired 
    ServiceClass1 serviceClass1; 

    @Autowired 
    ServiceClass1 serviceClass2;  

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

Tengo este error cuando se solicita la página

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) 

he hecho un poco Google-ing y parece que no puede encontrar ninguna respuesta sólida de por qué estoy recibiendo este error?

Respuesta

41

Necesitas Autowire contra el tipo de interfaz, no el tipo de clase, es decir

@Autowired 
ItemsService serviceClass1; 

Si tiene varios granos que implementan ItemsService, entonces Autowiring no es realmente apropiado. Considere el uso de @Resource en su lugar:

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

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

@skaffman .. entonces, ¿dónde debo especificar los nombres de recursos de frijol? Quiero decir que no estoy declarando los beans de servicio en el archivo xml o, al menos, pensé que no era necesario porque estaba usando "component-scan" ... sin declarar explícitamente en el archivo de configuración de beans, ¿cómo se llaman "serviceClass1"? "y" serviceClass2 "están resueltos? – RKodakandla

+0

@rrkwells: Los nombres de los beans se deducen de los nombres de las clases (por ejemplo, 'com.x.y.ServiceClass1' =>' serviceClass1'. – skaffman

+2

Realmente no me gusta este enfoque, ¿qué pasa si cambia el nombre de la clase? – Dejell

Cuestiones relacionadas