a2924058198 2024-09-02 15:58 采纳率: 86.7%
浏览 10
已结题

getRootConfigClasses和getServletConfigClasses有啥区别

这为什么会报错No bean named 'springSecurityFilterChain' available
MainConfiguration里就只有数据源的配置
WebConfiguration里只有Thymeleaf的配置
SecurityConfiguration里啥都没写,只加了注解


public class MainInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{MainConfiguration.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfiguration.class,SecurityConfiguration.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

我知道是我SecurityConfiguration写错位置了,但我不理解为什么不可以这样写
getRootConfigClasses和getServletConfigClasses有啥区别,还有为什么会报这个错

  • 写回答

1条回答 默认 最新

  • 努力努力再努力呐 2024-09-07 10:00
    关注

    在Spring Boot和Spring MVC的应用中,getRootConfigClasses() 和 getServletConfigClasses() 是Spring Boot内部使用的两个方法,特别是在使用Java配置(Java-based Configuration)和嵌入式Servlet容器时。然而,这两个方法并不是Spring Boot用户通常直接调用的,它们更多地是在Spring Boot的自动配置和启动过程中被内部框架使用。

    getRootConfigClasses() 和 getServletConfigClasses() 的区别
    getRootConfigClasses():这个方法通常用于定义根应用上下文(Root ApplicationContext)中的配置类。根应用上下文是所有子上下文(如Servlet应用上下文)的父上下文,它通常包含那些不特定于Servlet API的bean,如数据源(DataSource)、JPA配置等。
    getServletConfigClasses():这个方法用于定义Servlet应用上下文(Servlet ApplicationContext)中的配置类。Servlet应用上下文是特定于Web应用的,它包含那些与Servlet API紧密相关的bean,如视图解析器(View Resolvers)、控制器(Controllers)等。
    报错 "No bean named 'springSecurityFilterChain' available" 的原因
    这个错误通常发生在Spring Security被集成到Spring Boot应用中时,但Spring Security的配置没有正确设置。尽管你的MainConfiguration中只配置了数据源,WebConfiguration中配置了Thymeleaf,而SecurityConfiguration中什么都没写,但如果你在其他地方(如启动类上通过@EnableWebSecurity注解)启用了Spring Security,或者你的项目中包含了Spring Security的依赖,Spring Boot会尝试自动配置Spring Security。

    然而,由于SecurityConfiguration中没有提供必要的配置(比如配置HTTP安全策略),Spring Security无法创建一个名为springSecurityFilterChain的bean,这是Spring Security用于处理所有安全请求的过滤器链。

    解决方案
    如果你不打算使用Spring Security:
    确保你的项目中没有包含Spring Security的依赖。
    如果已经包含,请从pom.xml或build.gradle中移除它。
    如果你打算使用Spring Security:
    在SecurityConfiguration类中配置你的安全策略。
    使用@EnableWebSecurity注解来启用Spring Security。
    配置HTTP安全,例如:
    ``

    
    @Configuration  
    @EnableWebSecurity  
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {  
        @Override  
        protected void configure(HttpSecurity http) throws Exception {  
            http  
                .authorizeRequests()  
                .antMatchers("/").permitAll()  
                .anyRequest().authenticated()  
                .and()  
                .formLogin()  
                .loginPage("/login")  
                .permitAll()  
                .and()  
                .logout()  
                .permitAll();  
        }  
    }
    

    ```
    java

    确保你的配置类被Spring Boot扫描到(通常是通过将其放在主应用类所在包或其子包中)。这样,Spring Boot才能正确地创建和管理springSecurityFilterChain bean。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月18日
  • 已采纳回答 9月10日
  • 修改了问题 9月2日
  • 创建了问题 9月2日

悬赏问题

  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 C++行情软件的tick数据如何高效的合成K线
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战