Spring Data Repository的Aspect建议不起作用

编程入门 行业动态 更新时间:2024-10-28 06:26:42
本文介绍了Spring Data Repository的Aspect建议不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我试图创建一些切入点,然后在存储库建议之前,以便在Spring Boot中为Spring Data中的某些存储库启用过滤实体管理器。我在项目中也有Web和服务层,而AspectLogging也适用于两者。但我不能为存储库做同样的事情。我已经挣扎了2天,我尝试了很多东西来解决它。我几乎阅读了关于此的所有文档,问题和主题(代理问题CGlib和JDK代理等)。我用jhipster来创建项目。

im trying to create some pointcuts and before advices for Repositories in order to enable filtering over entitymanager for some Repositories in Spring Data in Spring Boot. i also have web and service layer in project and AspectLogging works for both. But i couldnt do same for repositories. i have been struggling for 2 days and i tried so many things for fix it. i read almost every docs, issues and threads about this( proxy issues CGlib and JDK Proxy etc). i used jhipster for creating project.

我无法使用CrudRepository部署除@Pointcut之外的应用程序。甚至它部署的@Before也没有在Repository中调用方法调用。我想我有类似的问题,如下面的问题。 代理混淆

i cant deploy Application except @Pointcut with CrudRepository. and even its deployed @Before isnt called for a method call in Repository. i think i have a similar Problem like in following question. proxy confusion

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.xxx.zzz.business.repository.ApplyRepository com.xxx.zzz.web.rest.applyResource.ApplyRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'applyRepository': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy173]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy173 at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... 61 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'applyRepository': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy173]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy173 at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116) at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1523) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:314) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1120) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1044) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) ... 63 more Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy173]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy173 at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:212) at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109) at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:447) at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:333) at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:293) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1719) at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:113) ... 70 more Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy173 at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:446) at org.springframework.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33) at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:317) at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:56) at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:202) ... 77 more

有谁知道它可能是什么?

Does anyone know what its could be ?

类和配置如下所示。

存储库:

public interface ApplyRepository extends JpaRepository<Apply,Long>,QueryDslPredicateExecutor<Apply> { public Page<Apply> findAll(Predicate predicate, Pageable p); } ... }

数据库配置:

@Configuration @EnableJpaRepositories("com.xxx.zzz.business.repository") @EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware") @EnableTransactionManagement//(proxyTargetClass = false) public class DatabaseConfiguration { ....

AspectJ配置:

AspectJ Config:

@Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) // @EnableLoadTimeWeaving(aspectjWeaving = ... ) public class LoggingAspectConfiguration { ...

系统架构:

@Aspect public class SystemArchitecture { /** * A join point is in the web layer if the method is defined * in a type in the com.xyz.someapp.web package or any sub-package * under that.W */ @Pointcut("within(com.xxx.zzz.web.rest..*)") public void inWebLayer() { } /** * A join point is in the service layer if the method is defined * in a type in the com.xyz.someapp.service package or any sub-package * under that. */ @Pointcut("within(com.xxx.zzz.business.service..*)") public void inServiceLayer() { } /** * A join point is in the data access layer if the method is defined * in a type in the com.xyz.someapp.dao package or any sub-package * under that. */ @Pointcut("within(com.xxx.zzz.business.repository..*)") public void inDataAccessLayer() { } /** * All layers */ @Pointcut("inWebLayer() || inServiceLayer() || inDataAccessLayer()") public void inALL(){ } @Pointcut("within(org.springframework.data.repository.CrudRepository)") //@Pointcut("execution(*org.springframework.data.repository.Repository+.* (..))") //@Pointcut("execution(* com.xxx.zzz.business.repository+.*(..))") //@Pointcut("execution(* org.springframework.data.jpa.repository.JpaRepository+.*(..))") //@Pointcut("execution(* com.xxx.zzz.business.repository.ApplyRepository.*(..))") public void inDATAExec(){} }

FilterAspect:

FilterAspect:

@Aspect @Transactional public class FilterAspect { private final Logger log = LoggerFactory.getLogger(this.getClass()); @PersistenceContext private EntityManager entitymanager; @Before("com.xxx.zzz.aop.logging.SystemArchitecture.inDATAExec())") // "execution(* com.xxx.zzz.business.repository.InvoiceRepository.*(..))" public void doAccessCheck() { if (TransactionSynchronizationManager.isActualTransactionActive() && SecurityUtils.isAuthenticated()) { Session session = entitymanager.unwrap(Session.class); session.enableFilter("GLOBAL_FILTER").setParameter("customerId", SecurityUtils.getCurrentCustomerId()); } }

编辑:我解决了问题。它以某种方式与错误的切入点和名称相关。我试图在存储库中更改自定义注释的切入点。它不适用于方法或类级别。我在下面的链接中读到了有关此问题。 建议1 建议2 即将挣扎数小时用于目标和注释。但没有结果。 是否真的不可能在Spring Data Repositories中添加自定义注释来提供建议?

i solved problem. it was related somehow to wrong pointscuts and names. i tried to change pointcuts for custom annotation in Repository. it doesnt work for method or class level. i read in following links issues about this. advice 1 advice 2 im struggling for hours for target and annotation. but no result. is it really imposible to add custom annotations in Spring Data Repositories for advicing ?

注释:

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) //@Inherited public @interface CustomerRequired { String value() default "customerrequired"; }

存储库:

public interface InvoiceRepository extends JpaRepository<Invoice,String>, QueryDslPredicateExecutor<Invoice> { @CustomerRequired public Page<Invoice> findAll(Predicate predicate, Pageable p); ... }

切入点和建议:

@Pointcut(value = "@target(customerRequired)",argNames = "customerRequired") public void targetCustomer(@SuppressWarnings("unused") CustomerRequired customerRequired) {/**/} @Before(value = "com.xxx.zzz.aop.logging.SystemArchitecture.targetCustomer(customerRequired) && com.xxx.zzz.aop.logging.SystemArchitecture.inDataLayer()") public void doAccessCheck(JoinPoint joinPoint, CustomerRequired customerRequired) { if (TransactionSynchronizationManager.isActualTransactionActive() && SecurityUtils.isAuthenticated()) { Session session = entitymanager.unwrap(Session.class); session.enableFilter("GLOBAL_FILTER").setParameter("customerId", SecurityUtils.getCurrentCustomerId()); } }

推荐答案

使用

@Pointcut("within(org.springframework.data.repository.CrudRepository)") public void inDATAExec(){}

使用如下

@Pointcut("this(org.springframework.data.repository.Repository)") public void inDATAExec(){}

它的作用是

any join point (method execution only in Spring AOP) where the proxy implements the Repository interface

你可以看一下 http:// docs .spring.io / spring / docs / current / spring-framework-reference / html / aop.html

希望有所帮助!

更多推荐

Spring Data Repository的Aspect建议不起作用

本文发布于:2023-11-22 17:26:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1618351.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:不起作用   建议   Data   Spring   Aspect

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!