2015-04-14 2 views
1

Я настроил приложение Spring с помощью Java-конфигурации. Когда я запускаю свое приложение, я получаю сообщение об ошибке NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined. Я определил все классы конфигурации, но эта ошибка все еще происходит. Как это исправить?Фильтр Spring Security, который не найден, несмотря на то, что он определен в конфигурации Java

Мой главный класс:

public class SiteMain implements WebApplicationInitializer {  
    private void initSpringMvcServlet(ServletContext container) { 
     AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 
     dispatcherContext.register(MvcConfig.class);  
     ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 
    } 

    private void initSpringRootContext(ServletContext container) { 
     XmlWebApplicationContext rootContext = new XmlWebApplicationContext(); 
     rootContext.setConfigLocation("/WEB-INF/site.xml"); 
     container.addListener(new ContextLoaderListener(rootContext)); 
    } 

    @Override 
    public void onStartup(ServletContext container) throws ServletException { 
     initSpringRootContext(container); 
     initSpringMvcServlet(container);  
    }  
} 

My Security Initializer класс:

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { } 

Мой класс MVC Config является:

@Configuration 
@EnableWebMvc 
@ComponentScan 
@Import(SecurityConfig.class) 
public class MvcConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(31556926); 
    } 
} 

My Security Config класс:

@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
     .antMatchers("/resources/**").permitAll().anyRequest().authenticated() 
     .and().formLogin().loginPage("/").permitAll() 
     .and().logout().permitAll() 
     .and().rememberMe(); 
    } 
} 
+0

Что именно находится в вашем классе SecurityWebApplicationInitializer? – NikolaB

+0

А что такое site.xml, что в нем определено? – NikolaB

+0

@NikolaB: Мой 'SecurityWebApplicationInitializer' ничего не содержит. То, что я дал, это все. 'site.xml' содержит некоторые компоненты и менеджер транзакций базы данных. – khateeb

ответ

1

Попробуйте заменить эту строку:

dispatcherContext.register(MvcConfig.class);  

с:

dispatcherContext.setConfigLocation("your.config.package"); 

добавить строку ниже:

container.addListener(new ContextLoaderListener(dispatcherContext)); 

Там нет необходимости в @Import (SecurityConfig) с setConfigLocation автоматически обнаружит все @Configuration аннотированные классы.

+0

Согласно документам, класс SecurityWebApplicationInitializer позаботится об этом. Кроме того, я настроен только на основе Java и не web.xml – khateeb

+0

'container.addListener (новый ContextLoaderListener (dispatcherContext));' сталкивается с 'container.addListener (новый ContextLoaderListener (rootContext));' и я получаю error 'java.lang.IllegalStateException: Невозможно инициализировать контекст, потому что уже присутствует корневой контекст приложения - проверьте, есть ли в вашем web.xml несколько определений ContextLoader *. Если я удалю' container.addListener (новый ContextLoaderListener (rootContext)); 'тогда бобы, которые я определил в' site.xml', не инициализируются. – khateeb