注入が必要なフィールドで @Resource を使用して Spring の @Configurable アノテーションを介して自動依存性注入を使用しようとしています。これには、spring-agent.jar を JVM に渡すなどのセットアップが必要でした。詳細については、こちらを参照してください。
それは動作します...ほとんど。Tomcat が起動すると、AspectJ の初期化メッセージが表示され、ユーザー オブジェクトは自動的に FileService 参照を取得します。
問題は、時々それが起こらないことです。完全にランダムに見えます。起動しても依存関係がインジェクトされないこともあれば、インジェクトされることもあります。以前は @Transactional が User にあることに問題がありました。競合が発生したためです。プロキシと信じています。私は JPA を使用しているため、私のユーザーは @Entity でマークされているため、現時点での最善の推測は、これが競合を引き起こしていることです。プロキシを自動プロキシできないことを読みました。競合を相殺するために、Hibernate(私のJPA impl)が使用するCGLIBとjavassistを除外することについて、オンラインで見つけたいくつかのメモに従いました。
手がかり:
- それはすべてまたは何もありません。私の @Configurable インスタンスはすべて注入されているか、どれも注入されていません。
- DB からのエンティティのリロード (再インスタンス化) は役に立たないようです。それは機能しているかどうかのどちらかです。
- Tomcat を何度でも再起動しても、問題は解決しません。再びサイコロを振るように見えるのは、再配備だけです。つまり、再デプロイすればうまくいくかもしれません。
何が問題なのかをどのように把握できますか? @Configurable を JPA で使用している人はいますか? 依存関係が実際に注入されていないのに、 dependencyCheck = trueがエラーをスローしないのはなぜですか?
実在物
@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" />
...