Implémentez le traitement des transactions pour la méthode. Lorsque j'ai essayé de l'implémenter à l'aide de l'annotation @Transactional, une BeanCreationException s'est produite lorsque j'ai ajouté l'annotation.
Créez une interface pour la classe qui contient la méthode cible pour le traitement des transactions et ajoutez l'annotation @Transactional à la méthode de la classe d'implémentation. Il n'y a maintenant aucune erreur et vous pouvez compiler avec succès.
HogeProcessor.java
public interface HogeProcessor extends Processor<Object, Object> {
Optional<Object> process(HogeEntity hogeEntity);
}
HogeProcessorImpl.java
public class HogeProcessorImpl implements HogeProcessor {
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Optional<Object> process(HogeEntity hogeEntity) {
...
...
}
}
J'ai fait des recherches par moi-même, mais je n'ai pas compris, alors je lui ai demandé de me le dire.
Si l'interface et la classe d'implémentation sont séparées et réparées, c'est la cause. http://stackoverflow.com/questions/15688689/unsatisfieddependencyexception-in-spring-illegal-arguments-for-constructor-a
En raison des spécifications de la bibliothèque utilisée pour AOP, les détails peuvent être trouvés ici. http://d.hatena.ne.jp/minokuba/20110321/1300705068
Je n'ai pas compris même après avoir lu la page qui m'a été enseignée, alors je l'ai recherchée. Voici un résumé du contenu recherché.
L'annotation @Transactional de Java est réalisée à l'aide de Spring AOP, mais cette bibliothèque AOP semble en être la cause.
Programmation orientée aspect. L'aspect est un comportement et une unité de traitement commun. Un mécanisme qui vous permet de sortir pour un traitement systématique commun qui n'est pas essentiel pour les entreprises.
Cette fois, AOP est utilisé pour insérer le processus pour démarrer la transaction au moment où la méthode spécifiée est appelée.
Il semble que l'AOP peut être activé en écrivant ce qui suit dans le fichier de configuration.
aop.xml
<!--Activer AOP-->
<aop:aspectj-autoproxy/>
Au printemps AOP -JDK Dynamic Proxy ・ CGLib Deux types peuvent être utilisés. Seul le proxy dynamique JDK a été utilisé dans le projet qui a rencontré le problème cette fois.
La classe ciblée par l'aspect AOP doit être un JavaBean.
- Spring crée un objet proxy pour la classe cible d'aspect au moment de l'exécution.
http://hamasyou.com/blog/2004/11/09/spring-framework-jue-shu-ki-aop/
En d'autres termes, lorsque la bibliothèque AOP crée un bean d'une classe cible d'aspect, elle crée un ProxyObject enveloppé dans un proxy (conversion de proxy).
Il semble qu'il ne soit pas possible d'auto-câbler une instance d'un bean qui a été rendu Proxy par le proxy dynamique JDK en spécifiant directement la classe d'implémentation.
http://kamatama41.hatenablog.com/entry/20140327/1395928048
Lors de l'utilisation de JDK DynamicProxy, la classe qui implémente l'interface est ciblée pour la conversion Proxy. En d'autres termes, il semble que la classe d'implémentation ne puisse pas être directement DI. Cette fois, j'ai essayé d'utiliser l'AOP de @ Transactional alors que la classe d'implémentation était directement DI, donc ce n'était pas la cible de Proxyization de JDK DynamicProxy, et la cause était que BeanCreationException s'est produite.
J'ai donc créé une nouvelle interface pour la classe existante, l'ai modifiée pour qu'elle fasse DI pour cette interface et l'ai résolue en faisant de la classe existante une classe d'implémentation de l'interface. De plus, il semble que la classe d'implémentation puisse être transformée en Proxy en utilisant CGLib qui est une autre bibliothèque AOP, donc je ne l'ai pas essayée cette fois, mais il semble y avoir un moyen de l'utiliser.
Recommended Posts