java - example - spring security spring mvc integration
Error al crear bean con el nombre ''defaultServletHandlerMapping (1)
Esta es una aplicación de primavera (con seguridad de primavera) + java + maven en eclipse. Me aparece el siguiente error al enviar un formulario de registro. Ver el resto de mis archivos posteriormente:
HTTP Status 500 - Request processing failed; nested exception is
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name ''defaultServletHandlerMapping'' defined in class
org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration:
Bean instantiation via factory method failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to instantiate
[org.springframework.web.servlet.HandlerMapping]:
Factory method ''defaultServletHandlerMapping''
threw exception; nested exception is java.lang.IllegalArgumentException:
A ServletContext is required to configure default servlet handling
Mis archivos:
AppInit
package com.myapp.config;
import org.springframework.security.web.context.*;
public class AppInit extends AbstractSecurityWebApplicationInitializer
}
Archivo de configuración de MyApp:
package com.myapp.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
import com.myapp.JDBC.EmailJDBC;
import com.myapp.JDBC.LastIdJDBC;
import com.myapp.JDBC.LoginJDBC;
import com.myapp.JDBC.PersonJDBC;
@EnableWebMvc //mvc:annotation-driven
@Configuration
@ComponentScan(basePackages ={ "com.myapp" })//, excludeFilters = {
//@Filter(type = FilterType.ANNOTATION, value = Configuration.class) })
public class myappConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean
public DriverManagerDataSource getDatasource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setPassword("1234567");
dataSource.setUrl("jdbc:mysql://localhost:3306/myapp");
dataSource.setUsername("root");
return dataSource;
}
@Bean
public LoginJDBC getLoginBean(){
LoginJDBC bean = new LoginJDBC();
bean.setDataSource(new myappConfig().getDatasource());
return bean;
}
@Bean
public PersonJDBC getPersonBean(){
PersonJDBC bean = new PersonJDBC();
bean.setDataSource(new myappConfig().getDatasource());
return bean;
}
@Bean
public EmailJDBC getEmailBean(){
EmailJDBC bean = new EmailJDBC();
bean.setDataSource(new myappConfig().getDatasource());
return bean;
}
@Bean
public LastIdJDBC getLastIdBean(){
LastIdJDBC bean = new LastIdJDBC();
bean.setDataSource(new myappConfig().getDatasource());
return bean;
}
}
Archivo WebInit:
package com.myapp.config;
import javax.servlet.Filter;
import org.springframework.core.annotation.Order;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class myappWebInit extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { myappConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/","/login", "/signuPerson","/regPerson","/regPersonSuccess" };
}
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfiguration.class };
}
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new HiddenHttpMethodFilter() };
}
}
Archivo de configuración de seguridad:
package com.myapp.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.*;
import org.springframework.security.web.csrf.CsrfTokenRepository;
import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
private CsrfTokenRepository csrfTokenRepository()
{
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setSessionAttributeName("_csrf");
return repository;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.csrfTokenRepository(csrfTokenRepository())
.and()
.authorizeRequests()
.antMatchers("/resources/**", "/signuPerson").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
//.failureUrl(authenticationFailureUrl)
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
Me disculpo por poner muchas cosas. Ya probé una solución a un problema similar a este, pero no funcionó. Cualquier sugerencia sería muy apreciada. ¡Gracias por adelantado!
Resolví el problema con la ayuda de una solución a un problema similar en esta Plataforma.
Excluí los filtros de configuración para que no se escanearan colocando las siguientes anotaciones en el archivo myappconfig:
@EnableWebMvc
@Configuration
@ComponentScan(
basePackages ={ "com.myapp" },
excludeFilters = {
@Filter(type = FilterType.ANNOTATION, value = Configuration.class)
}
)
Después de hacer esto, el problema no fue resuelto.
Luego @EnableWebMvc
y puse el archivo myappinit y el problema fue resuelto.
Supongo que @EnableWebMvc
y @ComponentScan(basePackages ={ "com.myapp" }, excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = Configuration.class) })
no deberían estar en el mismo archivo de configuración.