6

La documentación de Spring aconseja colocar la anotación @Transactional en la clase/método concreto en lugar de la interfaz. La razón de esto se ha cubierto el desbordamiento de pila en muchas ocasiones, por ejemplo:Spring @Transactional v Spring Security @ Comportamiento incoherente segmentado

Where should I put @Transactional annotation: at an interface definition or at an implementing class?

Spring Security comportamiento difiere @Secured; la mayoría de la documentación muestra colocar la anotación en la interfaz. De hecho, parece funcionar ya sea que anote la interfaz o la clase concreta, independientemente de si utiliza proxies JDK o CGLib.

Parece una solución superior. Entonces, ¿por qué la inconsistencia? Una respuesta a la pregunta anterior sugiere un impacto en el rendimiento ... pero seguramente el rendimiento es tan importante para la seguridad?

¿Y cómo se soluciona la solución @Secured con el problema de la herencia del diamante (la clase implementa 2 interfaces, ambas tienen el mismo método @Secured de forma diferente)?

Respuesta

3

Al utilizar tanto las delegaciones de JDK y CGLIB Se termina con TransactionInterceptor para @Transactional y MethodSecurityInterceptor para @Secured.

Pero esos dos MethodInterceptors usan mecanismos diferentes para encontrar la anotación en MethodInvocation dado.

anotación @Secured se encuentra por SecuredAnnotationSecurityMetadataSource usando AnnotationUtils.findAnnotation(Method method, Class<A> annotationType) método, mientras que @Transactional es descubierto por AnnotationTransactionAttributeSource con ayuda de SpringTransactionAnnotationParser.

Parece que AnnotationUtils tiene mecanismos mucho más avanzados de búsqueda de anotaciones, tanto para las interfaces como para el método que declara la jerarquía de clases.

Puede crear su propio TransactionAnnotationParser que use AnnotationUtils y esto debería permitir la misma funcionalidad para @Transactional.

AnnotationUtils devuelve la primera anotación encontrada, por lo que así se trata la herencia del diamante.

Cuestiones relacionadas