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?
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.
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;