SpringBoot创建CorsFilter Bean遇BeanNotOfRequiredTypeException错误求助
问题分析与解决方案
错误原因
你定义的@Bean方法名为corsFilter,返回类型是FilterRegistrationBean<CorsFilter>,但系统中存在对名称为corsFilter、类型为org.springframework.web.filter.CorsFilter的Bean依赖(可能是你的代码注入,或是Spring自动配置的隐式依赖)。Spring容器尝试将该Bean适配为CorsFilter类型时,发现实际类型是FilterRegistrationBean,类型不匹配,因此抛出BeanNotOfRequiredTypeException。
解决方案
方案1:拆分Bean定义(推荐)
分别定义CorsFilter类型的Bean和对应的注册Bean,既满足类型依赖,又完成过滤器注册:
@Bean public CorsFilter corsFilter() { CorsConfiguration corsConfig = new CorsConfiguration(); corsConfig.setAllowCredentials(true); corsConfig.setAllowedOrigins(delimitedStringToList(corsFilterAllowedOrigins)); corsConfig.setAllowedHeaders(delimitedStringToList(corsFilterAllowedHeaders)); corsConfig.setAllowedMethods(delimitedStringToList(corsFilterAllowedMethods)); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration(corsFilterAllowedPathPattern, corsConfig); return new CorsFilter(source); } @Bean public FilterRegistrationBean<CorsFilter> corsFilterRegistration(CorsFilter corsFilter) { FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>(corsFilter); registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; }
方案2:调整依赖注入类型(仅当不需要单独CorsFilter Bean时)
如果系统中没有对CorsFilter类型的直接依赖,只是你误写了注入类型,可以将注入点的类型改为FilterRegistrationBean<CorsFilter>,并保持原Bean定义不变。但这种方式不如方案1通用,不推荐。
补充说明
Spring Boot中注册过滤器时,若同时需要该Filter作为Bean被注入,必须拆分定义;若仅需注册过滤器,也可以直接返回Filter类型并配合@Order注解,但使用FilterRegistrationBean能更灵活地配置过滤器的路径、顺序等属性。
内容的提问来源于stack exchange,提问作者LittleLingzi
相关产品推荐
相关产品推荐

