Estoy tratando de utilizar la anotación @Autowired con mi interfaz genérica Dao así:Spring 3 DI mediante la interfaz DAO genérico
public interface DaoContainer<E extends DomainObject> {
public int numberOfItems();
// Other methods omitted for brevity
}
utilizo esta interfaz en mi controlador en el seguimiento de la moda:
@Configurable
public class HelloWorld {
@Autowired
private DaoContainer<Notification> notificationContainer;
@Autowired
private DaoContainer<User> userContainer;
// Implementation omitted for brevity
}
he configurado mi contexto de aplicación con el siguiente configuración
<context:spring-configured />
<context:component-scan base-package="com.organization.sample">
<context:exclude-filter expression="org.springframework.stereotype.Controller"
type="annotation" />
</context:component-scan>
<tx:annotation-driven />
Esto sólo funciona partiall y, dado que Spring crea e inyecta solo una instancia de mi DaoContainer, concretamente DaoContainer. En otras palabras, si pregunto userContainer.numberOfItems(); Consigo el número de notificationContainer.numberOfItems()
que he tratado de utilizar las interfaces inflexible con motivo de la aplicación correcta de esta manera:
public interface NotificationContainer extends DaoContainer<Notification> { }
public interface UserContainer extends DaoContainer<User> { }
y luego usaron estas interfaces como esto:
@Configurable
public class HelloWorld {
@Autowired
private NotificationContainer notificationContainer;
@Autowired
private UserContainer userContainer;
// Implementation omitted...
}
Lamentablemente esto no logra BeanCreationException:
org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.organization.sample.dao.NotificationContainer com.organization.sample.HelloWorld.notificationContainer; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.organization.sample.NotificationContainer] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Ahora, Estoy un poco confundido, ¿cómo debo proceder o si estoy usando múltiples Dao incluso posible? Cualquier ayuda sería muy apreciada :)
No veo ninguna clase de implementación para sus interfaces. ¿Cuántos hay y cómo se ven? – skaffman
No tenía implementaciones explícitas para las interfaces, ya que esperaba poder utilizar la clase de dao genérica (es decir, DaoContainer). Pude crear implementaciones explícitas (como señaló Espen en su respuesta). Eso simplemente no parece razonable, ya que estoy tratando de aprovechar los genéricos de Java tanto como sea posible. Sin embargo, tengo DaoContainerImpl . –
Peders
tal vez http://stackoverflow.com/questions/502994/spring-ioc-and-generic-interface-type/511417#511417 es una solución –