Warum Spring ' s @Konfigurierbare funktionieren manchmal und manchmal nicht?

Ich versuche, verwenden Sie das automatische dependency injection über Spring @Konfigurierbare annotation w/@Resource auf den Feldern benötigen, Injektion. Dies beinhaltete einige setup -, wie die übergabe spring-agent.jar zu meinem JVM. Für die vollen details siehe hier.

Funktioniert es... meistens. Wenn mein Tomcat hochfährt, sehe ich die AspectJ-init-Nachrichten, meine Benutzer-Objekte automatisch FileService-Verweise, etc.

Das problem ist, dass es manchmal einfach nicht passieren. Es scheint völlig zufällig zu sein; manchmal kann ich Booten und die Abhängigkeiten sind nicht gespritzt, manchmal sind Sie das. Ich hatte vorher Probleme mit der @Transactional auf meinem Benutzer, denn es entstand ein Konflikt, ich glaube, mit proxies. Ich bin mit JPA, also mein Benutzer ist gekennzeichnet mit @Entity, also meine beste Vermutung ist jetzt, dass dies einen Konflikt zu verursachen. Ich habe gelesen, Sie können nicht automatisch proxy ein proxy. Zum Ausgleich der Konflikt, folgte ich einige Notizen, die ich online gefunden über die ohne CGLIB und javassist die Hibernate (meine JPA-impl) verwendet.

Hinweise:

  • Es um alles oder nichts. Alle meine @Konfigurierbaren Instanzen wurden injiziert oder keiner von Ihnen.
  • Nachladen (reinstantiating) der Entität, von der DB scheint nicht zu helfen; es ist entweder arbeiten oder nicht.
  • Neustart von Tomcat eine beliebige Anzahl der Zeit auch gar nicht vor, es zu beheben. Die einzige Sache, die angezeigt wird, Rollen Sie die Würfel wieder erneut bereitstellen. In anderen Worten, wenn ich umschichten kann es funktionieren.

Wie kann ich herausfinden, was schief läuft? Ist jemand mit @Configurable mit JPA? Warum ist nicht mein dependencyCheck = true werfen einen Fehler, wenn die Abhängigkeiten nicht eigentlich gespritzt?

Person

@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" />

...
Auch ich habe schon erlebt, diese Art von Problemen mit @Configurable und @Transactional für eine lange Zeit. Ich denke, es hat zu tun mit der class-loader laden der Klassen vor dem spring Kontext initialisiert wird. Siehe diesen thread: forum.springsource.org/showthread.php?t=68406. Nur sporadisch dieser Fehler ist extrem nervig.
Angesichts all der änderungen, die sich auf den Frühling, gibt es jetzt eine bessere Lösung für dieses problem?

InformationsquelleAutor Robert Campbell | 2009-05-06

Schreibe einen Kommentar