Я пытаюсь использовать автоматическую инъекцию зависимости через Spring @Configurable annotation w/@Resource в областях, требующих инъекции. Это связано с некоторыми настройками, такими как передача spring-agent.jar в мою JVM. Полная информация see here.Почему Spring @Configurable иногда работает, а иногда нет?
Это работает ... почти все. Когда мой Tomcat загружается, я вижу сообщения об инициализации AspectJ, мои объекты User автоматически получают ссылки на FileService и т. Д.
Проблема в том, что иногда этого просто не происходит. Это кажется совершенно случайным; иногда я загружаюсь, и зависимости не вводятся, иногда они есть. Раньше у меня были проблемы с @Transactional, находящимся на моем пользователе, потому что это создало конфликт, я полагаю, с прокси. Я использую JPA, поэтому мой Пользователь помечен как @Entity, поэтому сейчас я думаю, что это создает конфликт. Я читал, что вы не можете автоматически проксировать прокси. Чтобы компенсировать конфликт, я следил за некоторыми заметками, которые я нашел в Интернете, за исключением CGLIB и javassist, который использует Hibernate (мой JPA impl).
Улики:
- Это все или ничего. Все мои @Configurable экземпляры были введены или ни один из них.
- Перезагрузка (переустановка) Сущность из БД не помогает; это либо работает, либо нет.
- Перезагрузка 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" />
...
Я тоже сталкивался с этими проблемами при использовании @Configurable и @Transactional для долгое время. Я думаю, что это связано с загрузкой классов загрузкой классов до инициализации контекста весны. См. эту тему: http://forum.springsource.org/showthread.php?t=68406. Спорадический характер эта ошибка очень раздражает. – ghempton
Учитывая все изменения в Spring, есть ли теперь лучшее решение этой проблемы? – Snekse