Próbuję użyć automatycznej iniekcji zależności za pomocą wiosennej @Configurable adnotation w/@Resource na polach wymagających iniekcji. Wiązało się to z pewną konfiguracją, jak przekazanie spring-agent.jar do mojej maszyny JVM. Pełne szczegóły see here.Dlaczego Spring @Configurable czasami działa, a czasami nie?
Działa ... głównie. Kiedy mój Tomcat się uruchamia, widzę komunikaty inicjujące AspectJ, moje obiekty User User automatycznie otrzymują odwołania do FileService itp.
Problem polega na tym, że czasami tak się nie dzieje. Wydaje się zupełnie przypadkowe; czasami uruchamiam się, a zależności nie są wstrzykiwane, czasami są. Wcześniej miałem problemy z @Transactional będąc na moim użytkowniku, ponieważ stworzyło konflikt, wierzę z proxy. Używam JPA, więc mój użytkownik jest oznaczony @Entity, więc teraz domyślam się, że powoduje to konflikt. Czytałem, że nie możesz automatycznie pośredniczyć w proxy. Aby zrównoważyć konflikt, poszedłem za notatkami, które znalazłem w Internecie, aby wyłączyć Hibernate (moje implanty JPA), wyłączając javassistCGLIB i .
Clues:
- To wszystko albo nic. Wszystkie moje instancje @Configurable zostały wstrzyknięte lub żadna z nich.
- Przeładowanie (przywrócenie) obiektu z DB nie wydaje się pomóc; działa albo nie.
- Zrestartowanie Tomcat dowolną liczbę razy również go nie naprawi. Jedyną rzeczą, która wydaje się rzucić kostką, jest ponowne wprowadzenie. Innymi słowy, jeśli mogę ponownie wdrożyć, może działać.
Jak mogę dowiedzieć się, co dzieje się nie tak? Czy ktoś używa @Configurable z JPA? Dlaczego mój dependencyCheck = true nie wyświetla komunikatu o błędzie, gdy nie są w rzeczywistości wstrzykiwane zależności?
Jednostka
@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" />
...
Ja też wystąpiły tego typu problemy z @Configurable i @ Transactional dla długi czas.Myślę, że ma to związek z ładowaniem klas klas przed rozpoczęciem kontekstu wiosny.Zobacz ten wątek: http://forum.springsource.org/showthread.php?t=68406.Sporadyczny charakter ten błąd jest bardzo denerwujący – ghempton
Biorąc pod uwagę wszystkie zmiany na wiosnę, czy istnieje teraz lepsze rozwiązanie tego problemu? – Snekse