问题标签 [spring-aspects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
spring - Spring Boot,@Configurable LoadTimeWeaving,Tomcat 8 - IllegalStateException
在我的 Spring Boot 1.3.3、Tomcat 8(嵌入式用于开发,独立用于生产)应用程序中,我将从 Spring 代理事务模式转移到 AspectJ 事务。
我添加了以下应用程序配置:
但是在嵌入式 Tomcat 8 上的应用程序启动期间(不要在独立 Tomcat 上对其进行测试)我遇到了以下异常:
我的配置有什么问题/不存在以及如何解决这个问题?
aspectj - Spring AOP:捕获参数注释的接口方法,但不存在注释
我正在使用 Spring AOP 来拦截方法执行。
我有一个如下所示的界面:
下面是接口的实现:
现在我希望任何具有@AwesomeAnnotation 注释的参数的方法都应该被Spring AOP 捕获。
所以我写了以下有效的方面。
但是,当我尝试查找参数注释时,我没有得到任何注释。如上所述,annotationMatrix 是空的。
所以这是我的问题:
- 为什么 annotationMatrix 是空的?可能是因为参数注释不是从接口继承的。
- 为什么我能够捕获方法执行。由于 Spring AOP 能够匹配切入点,因此 Spring 以某种方式能够看到方法的参数注释,但是当我尝试看到使用
methodSignature.getMethod().getParameterAnnotations()
它时不起作用。
java - 使用带有 javax.sql.DataSource.getConnection(..) 的 Pointcut 时出现 Spring AOP 代理问题
我试图通过在获得数据库连接后调用DBMS_SESSION.SET_IDENTIFIER('XXXX')过程来设置ClientIdentifier值。为了实现这一点,我使用了Spring AOP 方面,如链接中所述:http: //docs.spring.io/spring-data/jdbc/docs/current/reference/html/orcl.connection.html 下面是一段代码我有:
我在 spring 配置 xml 文件中配置了aop autoaspect 代理。
我是 Unsing web sphere application server来部署应用程序,我已经按照链接中的说明配置了数据源:http: //www.ibm.com/support/knowledgecenter/was_beta/com.ibm.websphere.base.doc/ae/tspr_config_data_access .html 当我部署我的应用程序时,出现以下错误。似乎 Spring 错误地尝试强制转换/子类是最终的并遇到 cglib 代理问题。如果我使用其他连接池提供程序数据源配置而不是Web Sphere JNDI 数据源,一切似乎都可以正常工作。我已经尝试使用org.apache.commons.dbcp.BasicDataSource并且能够成功设置客户端标识符值。以下是我在使用 web sphere JNDI 数据源时遇到的错误:
我还尝试使用proxy target= true 和 false来强制使用 JDK 动态代理而不是 cglib 创建代理。但在这两种方式中,它都使用 cglib 代理。
有没有人见过这种错误。有人可以查看错误并让我知道是否有其他替代解决方案可以解决此错误。
更新:添加 JNDI 配置。我在 web.xml 文件中定义了资源引用
我已经定义了数据源bean和jndi查找配置如下:
java - 为什么@PostConstruct 和@Retryable 不能一起使用?
我创建了一个基于 Spring 框架的应用程序,使用AnnotationConfigApplicationContext
.
一个 bean 有一个 init 方法,它创建到外部服务的连接。@PostConstruct
一旦启动了工作的bean,就可以对其进行注释以自动运行。
为了在创建此连接时处理任何异常,如果捕获到异常,我希望我的 init 方法最多重试 5 次。当用两者注释方法时@PostConstruct
,@Retryable
我看到异常被抛出一次并且程序退出 - 它似乎@Retryable
没有效果。
我已经@EnableRetry
在配置类中正确使用了@Configuration
. 我在同一个 bean 上创建了另一个方法 B,它被注释为可重试,如果在实例化 bean 之后调用此方法,我可以看到该方法在抛出异常时被重试/按预期运行。
我对为什么这不起作用的想法可能与某些方面有关,或者 postconstruct 发生在 spring-retry 元素附加之前?
实际上有没有更好的方法来拥有一个可以处理异常并可以通过注释重试的初始化方法 - 而不是在方法中以编程方式尝试?
编辑:我现在同意不应通过@Postconstruct
. 如果重试失败,这可能会阻止整个上下文初始化,这可能会产生不利影响。
然而,这还没有回答 Spring 框架的哪一部分不让这两个注释一起工作的问题。
spring - @AspectJ 方面未在使用 Spring 的应用程序中编织
我已将该行添加<context:load-time-weaver/>
到我的 application-context.xml,
并创建了一个META-INF\aop.xml
包含以下内容的文件:
包括一个包罗万象的方面,以简单地查看它是否有效:
但似乎什么也没发生,有什么想法吗?
spring - Spring AOP 排除一些类
我正在使用 Spring AspectJ 来记录方法执行统计信息,但是,我想在不更改切入点表达式的情况下从中排除一些类和方法。
为了排除某些方法,我创建了一个自定义注释,用于过滤掉。但是我无法对课程做同样的事情。
这是我的方面定义-
NoLogging
是我排除方法的自定义注释。
那么如何在不更改切入点表达式和不添加新顾问的情况下过滤掉某些类呢?
spring - Spring MVC 和 AOP:@Controllers 的 @Pointcuts 仅适用于测试,不适用于生产
我在 Web 环境中使用 Spring Framework 4.3.3:
我有两种情况:
RootApplicationContext
ServletApplicationContext
我知道其中ServletApplicationContext
包含有关 Web 端的所有 bean,例如@Controller
. 此外ServletApplicationContext
,还能够从RootApplicationContext
例如@Service, @Repository
等访问所有上下文或 bean。直到这里我都很好。
请注意,它也适用于@Configuration
课程。(基础设施)
因此,结合前面的介绍,我们可以这样思考:
ServletApplicationContext
-->RootApplicationContext
需要考虑的重要一点是,反过来是不可能的。
所以
RootApplicationContext
-->ServletApplicationContext
是不可能的。它有道理,还可以。服务器端不应访问 Web 端
关于 AspectJ。我有以下内容:
这里有一个重点:
- 这
AopConfig
是由扫描的RootApplicationContext
- 我相信
ServletApplicationContext
可以@Configuration
通过访问RootApplicationContext
- 我相信
好的,当我运行我的@Test
方法时。
当我从服务器端执行测试类时,我使用
@ContextConfiguration(classes={RootApplicationContext.class} )
- 仅有的
RootApplicationContext
- 仅有的
AOP 工作正常。我可以通过AOP + logging
以下过程确认:
@Service
->@Repository
当我从 Web 端执行测试类时,我使用:
@ContextConfiguration(classes={RootApplicationContext.class, ServletApplicationContext.class})
RootApplicationContext
和ServletApplicationContext
AOP 工作正常。我可以通过AOP + logging
以下过程确认:
@Controller
->@Service
->@Repository
现在生产我有:
但是,当我将项目导出为.war
文件并通过 URL/URIController
执行时,预期的行为或过程可以正常工作。但是关于 AOP 通过AOP + logging
以下过程发生:
@Service
->@Repository
@Controller
不会出现在输出中。预期的流程应该是:
@Controller
->@Service
->@Repository
那么为什么在测试中工作而不是在生产中呢?
我已经做了一个研究,我发现了这两个帖子:
实际上,他们说应该扫描@Configuration
类而不是通过@EnableAspectJAutoProxy
ServletApplicationContext
RootApplicationContext
即使这是真的(根据新的实验),请考虑在没有 Web 环境的情况下测试服务器端。
对于其他@Bean
关于基础设施的信息,通过@Configuration
已经解释过的关于ServletApplicationContext --> RootApplicationContext
如何预期工作的关系。只是用AOP就有这种情况。
问题 01:那么为什么会出现这种行为?
问题02:如何保持AopConfig
扫描RootApplicationContext
并获得生产的预期行为?
注意是否AopConfig
被 扫描ServletApplicationContext
。以下关于测试的内容对于服务器端是有效且强制性@ContextConfiguration(classes={RootApplicationContext.class, AopConfig.class} )
的。看到加法AopConfig.class
但是我觉得AopConfig
应该被扫描RootApplicationContext
。
spring-mvc - Spring MVC 和 AOP:@Pointcuts 仅适用于 Rest Controller,不适用于常见的 Web Controller
我Spring Framework
在 Web 环境中使用 4.3.3。
我有一个@Controller
用于Web
请求的方法Web Browser
,它使用其他方式的依赖关系,@Controller
但用于Rest
目的。后者提到使用@Service
等...
这种关于使用“Rest”的“Web”的方法如何在使用 Spring MVC的内容协商中解释依赖关系Combining Data and Presentation Formats
。直到这里进行开发/测试和生产工作正常。这是一种有价值的方法。
注意该类Rest
带有注释,@Controller
因为我使用ResponseEntity<?>
和@ResponseBody
。
问题在于AOP
关于它的基础设施,我有:
关于@Controller
s 我有这两个类:
PersonaDeleteOneController
和:deleteOne(@PathVariable String id, Model model)
为了@GetMapping
deleteOne(@PathVariable String id, RedirectAttributes redirectAttributes)
为了@DeleteMapping
PersonaRestController
deleteOne(@PathVariable String id)
为了@DeleteMapping
这两个类在同一个包中声明,名为:
com.manuel.jordan.controller.persona
我有以下内容@Pointcut
:
这@Pointcut
用于以下建议:
当我执行Rest
测试时,我可以通过AOP + logging
打印以下模式来确认:
@Controller
(休息)->@Service
->@Repository
直到这里所有的工作都按预期进行
当我执行Web
测试时,我可以通过AOP + logging
打印以下模式来确认:
@Controller
(休息)->@Service
->@Repository
我需要或期望的是以下内容:
@Controller
(网络)->@Controller
(休息)->@Service
->@Repository
有什么问题或遗漏?deleteOne
签名对它们的参数没有歧义。
生产的情况相同。
Α
这里的控制器:
和
你怎么能看到我不使用this.
来执行方法调用。
aop - Spring AOP:如何排除不必要的@Pointcut(@Around 建议)执行由于其他人的执行@Pointcuts/advices
我正在与:
Spring Framework
4.3.3AspectJ
1.8.9
我有以下正常过程:
@Controller
->@Service
->@Repository
我有以下一对AOP
:
PersonaServicePointcut
PersonaServiceAspect
场景如下:
该类有一些方法,@Service
例如: delete
、和。它们在同一个类中一起声明。save
update
findOneById
对于诸如delete
和update
通过之类的方法,AOP
我使用一个@Before
或@Around
建议来调用该findOneById
方法。
原因是如果实体不存在,执行delete
or方法(考虑 Rest 场景)是没有意义的。update
因此,advice
必须抛出异常,比如说 Exception A,它必须在@ControllerAdvice
该方法实际上采用了相同的save
方法。因此,在执行save
方法之前,其他 @Before
或@Around
通知再次调用该findOneById
方法。如果实体已经存在,则必须抛出异常,比如说 Exception B,它必须在@ControllerAdvice
请注意,我有 3 个点/3 个使用该findOneById
方法的建议。它检查是否存在实体。
例如:
同样:这 3 个建议使用或执行该findOneById
方法。
问题是当我添加一个新的切入点时,例如:
我创建了这个切入点来检查一个实体是否已经存在,如果它不存在,它必须抛出一个类型的异常C
(它适用于经典的 404)。
通过对方法本身的or建议执行该findOneById
方法似乎是多余的。但我需要这个来达到目的,也需要创建C类型的例外。它必须由某些人处理@Before
@Around
findOneById
logging
audit
@ControllerAdvice
问题是当其他方法的建议被delete/update/save
执行时(记住他们也调用并执行了findOneById
方法)我findOneByIdPointcut
被不必要地执行了。
我需要更改切入点声明以指示如下内容:
在哪里Alpha
:
执行@Service
'sfindOneById
方法的 before/around 建议,但 如果它的调用是从类的其他建议中完成的,则永远不会
PersonaServiceAspect
。
我尝试了很多方法!execution
和!within
组合,但没有结果。
即使我只创建了一个切入点,它使用其各自独特的建议拦截 所有's 方法,并且通过参数我能够检查调用了什么方法,然后执行相应的控制。但是这种行为再次发生。@Service
@Around
ProceedingJoinPoint proceedingJoinPoint
这意味着,通过以下方式:
anyMethodPointcut
在哪里execution(* mypackage.PersonaServiceImpl.*(..))
有可能实现这种方法吗?如何?
谢谢。
spring - 春季应用程序中非弹簧豆的加载时间编织
我有一个带有一些 REST 控制器、服务类和助手类的 Spring Boot 应用程序。控制器和服务类是 spring 管理的,而 helper 类不是 spring 管理的,并且大部分包含静态方法。
AspectJ 配置存在于 java 配置中,如下所示
对应的LoggingAspect类如下,
- 调用控制器时,启用 Aspect 的日志记录适用于控制器和服务功能,但不适用于辅助功能。
- 如果我们在控制器中自动装配辅助类,非静态辅助方法开始显示 aspectj 日志。但是,静态辅助方法仍然不显示 aspectj 日志
问题,1. 我们如何为非弹簧管理的类配置 aspectj 建议,即没有 @Bean、@Autowired、@Component 等。2. 我们如何为静态方法配置 aspectj 建议(我正在使用 @EnableLoadTimeWeaving 但也许我我错过了什么) 3. 如果可能的话,AspectJ 配置应该是基于 java 的
如果需要更多详细信息,请告诉我