gpt4 book ai didi

spring - Spring Controller 和 Webflow 操作的 AspectJ autoproxy 问题

转载 作者:行者123 更新时间:2023-12-01 16:05:01 25 4
gpt4 key购买 nike

我有两个关于 spring/AspectJ AOP 的相关问题。我有一个典型的记录器方面,它记录从我的应用程序中的任何类抛出的异常,包括服务、daos、 Controller 和 webflow 操作...

@Aspect
public class AspectLogger {

@AfterThrowing(pointcut = "execution(* com.myapp..*.*(..))", throwing = "t")
public void logGustavoException(JoinPoint joinPoint, Throwable t) {

Log logger = LogFactory.getLog(joinPoint.getTarget().getClass());
logger.error(t.getMessage(), t);
}
}

在我的应用程序上下文中,我有一个同样典型的配置...

<context:annotation-config />

<!-- AOP logging config -->
<aop:aspectj-autoproxy>
<aop:include name="aspectLogger" />
</aop:aspectj-autoproxy>

<bean id="aspectLogger" class="com.myapp.AspectLogger" />

这在大多数情况下工作正常,我遇到的问题是实现接口(interface)的 webflow 操作和 Controller 。

1 - 实现接口(interface)的 Controller ......

我们的一个 Controller 实现了一个接口(interface),该接口(interface)定义了一个方法,并定义了几个用作@RequestMapping 处理程序的公共(public)方法...

@Controller
public class AmazingController implements OutstandingInterface {

// implements the method from OutstandingInterface
@Override
public Object doSomethingOutstanding(){
...
}

@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model) {
return "anAmazingViewName";
}

...
}

这里的问题是,由于 Controller 实现的接口(interface)未定义其所有公共(public)方法(即 Controller 请求映射方法),因此为 Controller 创建了一个代理,该代理仅代理“doSomethingOutstanding”方法来自 OutstandingInterface。因此,当请求进入/amazingUrl.htm 时,Spring 不会将其路由到适当的请求处理程序——就好像请求映射不存在一样。 我已经通过为 Controller 定义一个接口(interface)来解决这个问题,该接口(interface)扩展了 OutstandingInterface 并且还定义了 Controller 所需的请求处理程序方法,但对我来说似乎奇怪/错误的是必须为 Controller 定义一个接口(interface)只是为了AspectJ 的东西不会“隐藏”请求处理程序...

@Controller
public interface IAmazingController extends OutstandingInterface{

@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model);

}

...

public class AmazingController implements IAmazingController {

@Override
public Object doSomethingOutstanding(){
...
}

@Override
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model) {
return "anAmazingViewName";
}

...
}

2 - Webflow 操作

第二期很相似。引入 AspectJ 配置后,我的 webflow Action 类都没有被正确地 Autowiring ——我一直收到“找不到 FantasticAction 类型的 bean”之类的错误。同样,我为所有 Action 类引入了接口(interface),这解决了问题,因为它是在运行时注入(inject)的代理,而不是实际的操作实现类。

最后... 两种情况下的问题是 - 是否有一种方法可以解决这些 AspectJ 问题,而不必为我想建议的每个类定义接口(interface)?

最佳答案

你应该在你的类路径中添加 CGLIB 依赖,这样你就不需要创建接口(interface)来使用 AOP

查看 doc .

关于spring - Spring Controller 和 Webflow 操作的 AspectJ autoproxy 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11314099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com