springboot 使用@Bean 注入失败,Parameter 0 of method required a bean of type that could not be found.

编程入门 行业动态 更新时间:2024-10-23 11:24:08

springboot 使用@Bean 注入失败,<a href=https://www.elefans.com/category/jswz/34/1769966.html style=Parameter 0 of method required a bean of type that could not be found."/>

springboot 使用@Bean 注入失败,Parameter 0 of method required a bean of type that could not be found.

springboot中我们经常使用@Configuration 和 @Bean注解的方式去声明Bean,

@Configuration
public class SecurityAccessAutoConfiguration {@ConditionalOnMissingBean@Beanpublic ISecurityAccessUserProviderAdapter defaultSecurityAccessTokenResolver(SecurityAccessTokenProperties securityAccessTokenProperties){return new ConfigableSecurityAccessUserProviderAdapter(securityAccessTokenProperties);}@ConditionalOnMissingBean@Beanpublic ISecurityAccessTokenResolver defaultSecurityAccessTokenResolver(SecurityAccessTokenProperties securityAccessTokenProperties, ISecurityAccessUserProviderAdapter securityAccessUserProviderAdapter) {return new DefaultSecurityAccessTokenResolver(securityAccessTokenProperties,securityAccessUserProviderAdapter);}@Beanpublic FilterRegistrationBean securityAccessTokenFilter(ISecurityAccessTokenResolver resolver, JwtProperties jwtProperties) {SecurityAccessTokenFilter securityAccessTokenFilter = new SecurityAccessTokenFilter(resolver);FilterRegistrationBean<SecurityAccessTokenFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(securityAccessTokenFilter);List<String> urlPatterns = new ArrayList<>();String[] urls = jwtProperties.getUrlPatterns().split(",");for (String url : urls) {urlPatterns.add(url);// 拦截路径,可以添加多个}registrationBean.setUrlPatterns(urlPatterns);registrationBean.setOrder(0);return registrationBean;}}

启动的时候 报错,方法securityAccessTokenFilter 通过入参的方式注入ISecurityAccessTokenResolver 类型的bean,由于没有找到ISecurityAccessTokenResolver类型的bean 定义导致注入失败。:

Parameter 0 of method securityAccessTokenFilter in com.gsoft.security.autoconfigurer.SecurityAccessAutoConfiguration required a bean of type 'com.gsoft.base.api.security.ISecurityAccessTokenResolver' that could not be found.Action:Consider defining a bean of type 'com.gsoft.base.api.security.ISecurityAccessTokenResolver' in your configuration.

但是ISecurityAccessTokenResolver类型的bean已经通过 defaultSecurityAccessTokenResolver方法声明了,怎么会提示说找不到?

查看源码发现注入是在DefaultListableBeanFactory方法实现的,使用getBean 方式获取defaultSecurityAccessTokenResolver 对应的bean实现,发现实现类竟然是ConfigableSecurityAccessUserProviderAdapter。

我们明明定义的是DefaultSecurityAccessTokenResolver,怎么会变成ConfigableSecurityAccessUserProviderAdapter

查看代码发现,@Bean注解的方法名重复了,默认情况下,使用 @Bean声明一个bean,bean的名称由方法名决定。

因此相同的bean name不会重复执行,导致只实例化ISecurityAccessUserProviderAdapter 类型的bean,而ISecurityAccessTokenResolver 类型并未实例化,导致注入失败。

解决办法: 修改其中的一个defaultSecurityAccessTokenResolver方法的名称为 configableSecurityAccessUserProviderAdapter,避免bean的名称重复,问题解决。

@Configuration
public class SecurityAccessAutoConfiguration {@ConditionalOnMissingBean@Beanpublic ISecurityAccessUserProviderAdapter configableSecurityAccessUserProviderAdapter(SecurityAccessTokenProperties securityAccessTokenProperties){return new ConfigableSecurityAccessUserProviderAdapter(securityAccessTokenProperties);}@ConditionalOnMissingBean@Beanpublic ISecurityAccessTokenResolver defaultSecurityAccessTokenResolver(SecurityAccessTokenProperties securityAccessTokenProperties, ISecurityAccessUserProviderAdapter securityAccessUserProviderAdapter) {return new DefaultSecurityAccessTokenResolver(securityAccessTokenProperties,securityAccessUserProviderAdapter);}@Beanpublic FilterRegistrationBean securityAccessTokenFilter(ISecurityAccessTokenResolver resolver, JwtProperties jwtProperties) {SecurityAccessTokenFilter securityAccessTokenFilter = new SecurityAccessTokenFilter(resolver);FilterRegistrationBean<SecurityAccessTokenFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(securityAccessTokenFilter);List<String> urlPatterns = new ArrayList<>();String[] urls = jwtProperties.getUrlPatterns().split(",");for (String url : urls) {urlPatterns.add(url);// 拦截路径,可以添加多个}registrationBean.setUrlPatterns(urlPatterns);registrationBean.setOrder(0);return registrationBean;}
}

更多推荐

springboot 使用@Bean 注入失败,Parameter 0 of method required a bean of type that could

本文发布于:2024-02-27 06:59:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1705616.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Parameter   Bean   springboot   method   type

发布评论

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

>www.elefans.com

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