gpt4 book ai didi

java - 启用 Spring AOP 时出现 BeanNotOfRequiredTypeException

转载 作者:行者123 更新时间:2023-12-01 17:51:30 27 4
gpt4 key购买 nike

我的 Spring MVC 项目与 Apache Shiro 一起运行,以确保 Web 和 API 安全。生活很美好,直到有一天我必须进行权限检查以获取授权。

使用@RequiresPermissions注释要求我使用以下代码启用Spring AOP:

 <bean id="annotationProxy" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>

现在运行项目时出现错误,如下所示:

[http-nio-8084-exec-66] WARN org.springframework.web.context.support.XmlWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myController': Unsatisfied dependency expressed through field 'myService'; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'myService' is expected to be of type [com.service.myService] but was actually of type [com.sun.proxy.$Proxy594] [http-nio-8084-exec-66] ERROR org.springframework.web.context.ContextLoader - Context initialization failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myController': Unsatisfied dependency expressed through field 'myService'; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'myService' is expected to be of type [com.service.myService] but was actually of type [com.sun.proxy.$Proxy594]

请帮忙。

最佳答案

你的问题并没有给实际场景提供太多线索。但上周我自己在帮助调试同事的神秘错误时刚刚遇到了类似的错误,这里是我学到的总结。

当启用AOP时,如果你的类实现了一个接口(interface),Spring默认会为该接口(interface)创建一个代理,而不是实际的类。

那么,假设您的服务属于以下类型:

@Service
public class UserService implements Service {
// ...
}

然后将为接口(interface) Service 创建代理,如果您尝试将其注入(inject)到 UserService 类型的变量或参数中,例如:

public class MyServiceFacade {
@Autowired
private UserService userService;

// ...
}

这成为一个问题,因为代理的类型错误。该错误消息非常令人困惑,因为它没有明确告诉您创建了哪种代理以及为什么会导致类型不匹配。

要解决此问题,您可以在调用代码中使用接口(interface),或者将 AOP 配置更改为使用目标类作为代理,这可以通过将 proxy-target-class 属性设置为 true

请参阅 Proxying mechanisms 上的 Spring 说明了解更多信息.

关于java - 启用 Spring AOP 时出现 BeanNotOfRequiredTypeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49605933/

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