Sto cercando di utilizzare l'integrazione della dipendenza automatica tramite l'annotazione @Configurable di Spring w/@Resource nei campi che richiedono l'iniezione. Ciò ha comportato alcune impostazioni, come il passaggio di spring-agent.jar alla mia JVM. Per i dettagli completi see here.Perché a volte la funzione di configurazione di Spring @ funziona correttamente e talvolta no?
Funziona ... principalmente. Quando il mio Tomcat si avvia, vedo i messaggi di avvio di AspectJ, i miei oggetti User ottengono automaticamente riferimenti a FileService, ecc.
Il problema è che a volte semplicemente non accade. Sembra essere completamente casuale; a volte mi avvio e le dipendenze non vengono iniettate, a volte lo sono. In precedenza avevo avuto problemi con @Transactional sul mio utente perché creava un conflitto, credo con i proxy. Sto usando JPA, quindi il mio utente è contrassegnato con @Entity, quindi la mia ipotesi migliore ora è che questo sta creando un conflitto. Ho letto che non puoi eseguire il proxy automatico di un proxy. Per compensare il conflitto, ho seguito alcuni appunti che ho trovato online sull'esclusione di CGLIB e javassist utilizzato da Hibernate (my impl JPA).
Indizi:
- E 'tutto o niente. Tutte le istanze @Configurable sono state iniettate o nessuna di queste.
- Ricaricando (reinstantiating) l'entità dal DB non sembra aiutare; funziona o no.
- Il riavvio di Tomcat da un qualsiasi numero di volte non lo risolve nemmeno. L'unica cosa che sembra tirare di nuovo i dadi è una ridistribuzione. In altre parole, se lo ridistribuisco potrebbe funzionare.
Come posso capire cosa non va? Qualcuno usa @Configurable con JPA? Perché il mio dependencyCheck = true non genera un errore quando le dipendenze non vengono effettivamente iniettate?
Entity
@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" />
...
Anche io ho riscontrato questo tipo di problemi con @Configurable e @Transactional per a lungo penso che abbia a che fare con il caricatore di classi che carica le classi prima che il contesto di primavera sia inizializzato.Vedi questa discussione: http://forum.springsource.org/showthread.php?t=68406. La natura sporadica di – ghempton
Date tutte le modifiche a Spring, ora c'è una soluzione migliore a questo problema? – Snekse