나는 주입이 필요한 필드에 Spring의 @Configurable annotation w/@Resource를 통해 자동 의존성 주입을 사용하려고한다. 이것은 JVM에 spring-agent.jar를 전달하는 것과 같은 몇 가지 설정과 관련이 있습니다. 전체 내용은 see here입니다.왜 Spring의 @Configurable은 때때로 작동하며 때로는 그렇지 않습니까?
주로 작동합니다. Tomcat이 부팅 될 때 AspectJ 초기화 메시지가 나타나고 User 객체는 FileService 참조를 자동으로 가져옵니다.
가끔 문제가 발생하는 경우가 있습니다. 완전히 무작위로 보인다. 때로는 부팅을하고 의존성을 주입하지 않으며 때로는 의존성을 주입하지도합니다. 이전에 @Transactional이 사용자에게 문제가 발생했기 때문에 충돌이 발생했기 때문에 프록시로 믿습니다. 나는 JPA를 사용하고있어서, 나의 사용자는 @Entity로 표시되어있다. 그래서 가장 좋은 추측은 이것이 충돌을 일으킨다는 것이다. 프록시 자동 프록시를 사용할 수 없다는 것을 읽었습니다. 충돌을 상쇄하기 위해 나는 온라인에서 찾은 몇 가지 노트를 따라 갔다. CGLIB과 하이버 네이트 (내 JPA impl)가 사용하는 javassist을 제외했다.
단서 :
- 그것은 전부 또는 아무것도입니다. 모든 @Configurable 인스턴스가 삽입되었거나 삽입되지 않았습니다.
- DB에서 엔터티를 다시로드 (reinstantiating)해도 도움이되지 않습니다. 그것은 작동하거나하지 않습니다.
- 톰캣을 재부팅해도 몇 번이라도 문제가 해결되지 않습니다. 거푸집을 다시 굴리는 것만이 재배치입니다. 즉, 재배포하면 작동 할 수 있습니다.
어떻게 될 수 있습니까? @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" />
...
@Configurable 및 @Transactional과 관련된 이러한 유형의 문제도 발생했습니다. 오래 동안, 스프링 컨텍스트가 초기화되기 전에 클래스 로더가 클래스 로딩과 관련이 있다고 생각합니다.이 스레드를보십시오 : http://forum.springsource.org/showthread.php?t=68406. 이 버그는 매우 귀찮습니다. – ghempton
스프링에 대한 모든 변경 사항을 고려하면이 문제에 대한 더 나은 해결책이 있습니까? – Snekse