Я пытаюсь использовать автоматическое внедрение зависимостей через аннотацию Spring @Configurable w / @Resource для полей, требующих внедрения. Это включало некоторую настройку, такую как передача spring-agent.jar моей JVM. Для полной информации см. Здесь .
Это работает ... в основном. Когда мой Tomcat загружается, я вижу сообщения инициализации AspectJ, мои объекты User автоматически получают ссылки FileService и т. Д.
Проблема в том, что иногда этого просто не происходит. Это кажется совершенно случайным; иногда я загружаюсь и зависимости не вводятся, иногда они есть. Раньше у меня были проблемы с тем, что @Transactional был на моем Пользователе, потому что это создало конфликт, я полагаю, с прокси. Я использую JPA, поэтому мой пользователь помечен @Entity, поэтому сейчас я думаю, что это создает конфликт. Я читал, что вы не можете автоматически прокси прокси. Чтобы компенсировать конфликт, я следил за некоторыми заметками, которые я нашел в Интернете об исключении CGLIB и javassist , которые использует Hibernate (мой JPA).
Подсказки:
- Это все или ничего. Все мои экземпляры @Configurable были введены или ни один из них.
- Перезагрузка (восстановление) сущности из БД, похоже, не помогает; это либо работает, либо нет.
- Перезагрузка Tomcat в любое время также даже не исправит это. Единственное, что снова бросает кости - это повторное развертывание. Другими словами, если я перераспределу, это может сработать.
Как я могу понять, что происходит не так? Кто-нибудь использует @Configurable с JPA? Почему мой dependencyCheck = true не выдает ошибку, когда зависимости фактически не вводятся?
Entity
@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" />
...