Estoy tratando de usar la inyección de dependencia automática a través de la anotación @Configurable de Spring w/@Resource en los campos que necesitan inyección. Esto implicó alguna configuración, como pasar spring-agent.jar a mi JVM. Para los detalles completos see here.¿Por qué a veces funciona el @Configurable de Spring ya veces no?
Funciona ... principalmente. Cuando mi Tomcat está arrancando, veo los mensajes de inicio de AspectJ, mis objetos de usuario obtienen referencias de FileService automáticamente, etc.
El problema es que a veces simplemente no sucede. Parece ser completamente al azar; a veces reinicio y las dependencias no se inyectan, a veces lo hacen. Anteriormente tuve problemas con @Transactional en mi usuario porque creó un conflicto, creo que con proxies. Estoy usando JPA, por lo que mi usuario está marcado con @Entity, por lo que mi mejor intento ahora es que esto está creando un conflicto. He leído que no puedes autorizar automáticamente un proxy. Para compensar el conflicto, seguí algunas notas que encontré en línea sobre la exclusión de CGLIB y javassist que utiliza Hibernate (mi JPA impl).
pistas:
- Es todo o nada. Todas mis instancias @Configurable han sido inyectadas o ninguna de ellas.
- Recargar (volver a instalar) la entidad de la base de datos no parece ayudar; está funcionando o no.
- Reiniciar Tomcat cualquier cantidad de tiempo tampoco lo arreglará. Lo único que parece tirar los dados nuevamente es una redistribución. En otras palabras, si vuelvo a desplegarlo, puede funcionar.
¿Cómo puedo averiguar qué está pasando mal? ¿Alguien está usando @Configurable con JPA? ¿Por qué no está mi dependencyCheck = true lanzando un error cuando las dependencias no se han inyectado realmente?
Entidad
@Entity
@Configurable(dependencyCheck = true)
@NamedQueries({ @NamedQuery(name = "User.findAll", query = "SELECT user FROM User user"),
@NamedQuery(name = "User.findByEmail", query = "SELECT user FROM User user WHERE user.email = :email") })
public abstract class User extends BaseModel {
private static final long serialVersionUID = 7881431079061750040L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@Column(unique = true, nullable = false)
private String email;
@Basic(optional = false)
private String password;
@Resource
private transient UserEmailer userEmailer;
@Resource
private transient FileService fileService;
...
aop.xml
<!DOCTYPE aspectj PUBLIC
"-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver options="-verbose">
<include within="com.myapp.domain..*" />
<exclude within="*..*CGLIB*" />
<exclude within="*..*javassist*" />
</weaver>
<aspects>
<aspect name="org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect" />
</aspects>
</aspectj>
applicationContext.xml
...
<context:spring-configured />
<context:load-time-weaver />
<context:component-scan base-package="com.myapp" />
...
Yo también he tenido este tipo de problemas con @Configurable y @Transactional para un largo tiempo. Creo que tiene que ver con el cargador de clases que carga las clases antes de que se inicialice el contexto de primavera. Consulte este hilo: http://forum.springsource.org/showthread.php?t=68406. La naturaleza esporádica de este error es extremadamente molesto. – ghempton
Teniendo en cuenta todos los cambios a Spring, ¿hay ahora una mejor solución para este problema? – Snekse