web-dev-qa-db-fra.com

Erreur d'annotation transactionnelle

Lorsque je mets l'annotation "@Transactional(readOnly=false)" dans ma classe Service, j'obtiens l'erreur suivante

La description:

Le bean 'studentService' n'a pas pu être injecté en tant que 'com.student.service.StudentServiceImpl 'car il s'agit d'un proxy dynamique JDK qui implémente: com.student.service.StudentService

Exemple de code:

@Service("studentService")
@Transactional(readOnly=false)
public class StudentServiceImpl implements StudentService {

}

public interface StudentService {

}

Action:

Envisagez d'injecter le bean comme l'une de ses interfaces ou de forcer l'utilisation de proxys basés sur CGLib en définissant proxyTargetClass=true sur @EnableAsync et/ou @EnableCaching.

Processus terminé avec le code de sortie 1

Qu'est-ce qui cause cela?

14
syv

dans les projets de démarrage de printemps, essayez d'ajouter:

spring.aop.proxy-target-class=true

à votre application.properties

OU

@EnableAspectJAutoProxy(proxyTargetClass = true)

à votre point d'entrée de démarrage de printemps.

16
mtbadi39

Comme SO déjà mentionné dans le commentaire, l'erreur se produit lorsque vous essayez d'injecter/câbler automatiquement la classe d'implémentation au lieu de l'interface.

Le bean 'studentService' n'a pas pu être injecté en tant que 'com.student.service.StudentServiceImpl' car il s'agit d'un proxy dynamique JDK qui implémente: com.student.service.StudentService

Sur la configuration publiée par SO,

public class StudentServiceImpl implements StudentService {
}

public interface StudentService {
}

Si vous câblez automatiquement l'interface comme ci-dessous, vous n'obtiendrez pas d'erreur:

@Autowired //or @Inject
StudentService studentService;
16
gtiwari333