Generé una aplicación web Spring Boot usando Spring Initializr, usando el motor de plantilla integrado Tomcat + Thymeleaf, y el paquete como un archivo JAR ejecutable.
Tecnologías utilizadas:
Spring Boot 1.4.2.RELEASE, Spring 4.3.4.RELEASE, Thymeleaf 2.1.5.RELEASE, Tomcat Embed 8.5.6, Maven 3, Java 8
Tengo esta clase de seguridad.
com.tdk.config /** * @author nunito * @version 1.0 * @since 4 mar. 2017 */ @Configuration @EnableWebSecurity @PropertySource("classpath:/com/tdk/config/app-${APP-KEY}.properties") public class SecurityConfig extends WebSecurityConfigurerAdapter { protected String loginPage = "/tdk/login"; @Override protected void configure(HttpSecurity http) throws Exception { http .formLogin() .loginPage(getLoginPage() ) .permitAll() .and() .authorizeRequests() .antMatchers("/mockup/**").permitAll() .antMatchers("/welcome/**").authenticated() .and() .logout() .permitAll() .logoutSuccessUrl("/index.html"); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .passwordEncoder(new StandardPasswordEncoder()) .withUser("nunito").password("08c461ad70fce6c74e12745931085508ccb2090f2eae3707f6b62089c634ddd2636f380f40109dfb").roles("ADMIN").and() .withUser("nunito").password("4cfbf05e4493d17125c547fdba494033d7aceee9310f253f3e96c4f928333d2436d669d63a84fe4f").roles("ADMIN"); } public String getLoginPage() { return loginPage; } public void setLoginPage(String loginPage) { this.loginPage = loginPage; }Usando este archivo de configuración
@SpringBootApplication @ComponentScan(basePackages = "com.tdk.config") @EnableAutoConfiguration public class TdkCloudApplication { public static void main(String[] args) { SpringApplication.run(TdkCloudApplication.class, args); } }Tengo un 404 dondequiera que accedo en la URL
Pero esta configuración todo está bien
@SpringBootApplication @EnableAutoConfiguration @Import({SecurityConfig.class}) public class TdkCloudApplication { public static void main(String[] args) { SpringApplication.run(TdkCloudApplication.class, args); } }Me gustaria saber la diferencia, porque para mi son dos formas diferentes de hacer exactamente lo mismo pensar
Esta es una explicación de @Import y @ComponentScan , esta no es una respuesta a su pregunta (porque no sé por qué no funciona con ComponentScan), más bien es una pista.
@Import se usa para importar otras configuraciones, por lo que si una clase se anota con @Configuration y hay algunos beans definidos allí, se importarán al contexto de la aplicación, por ejemplo
@Configuration public class config{ @Bean public ClassA a(){ return new ClassA(); } } @Import({config.Class}) // import Bean for ClassA @ComponentScan escanea todas las clases anotadas con @Component , @Service , @Repository y asigna un bean uno a uno a cada clase. p.ej
@Component public class ClassB {} @ComponentScan // import Bean ClassB Después de la versión 4.2 de Spring, @ComponentScan también puede escanear @Configuration como un componente. Entonces, en su caso, SecurityConfig también debe importarse al contexto como un componente pero no como una configuración.
Lo único que no entiendo del todo es cómo @Import activa la ejecución del código en SecurityConfig, por favor dé un comentario si alguien lo sabe.
Lo siento por la respuesta tardía. Pero podría ayudar a alguien. El paquete de "TdkCloudApplication" no está presente en la pregunta. Supongo que está en un paquete diferente al de "com.tdk.config". si este es el caso, entonces en la anotación @ComponentScan(), debe proporcionar el paquete de TdkCloudApplication y el paquete de "SecurityConfig"
como esto. @ComponentScan(basePackages = {"com.tdk.config", "packageName of TdkCloudApplication"}).
Es por @SpringBootApplication. por defecto buscará beans en ese paquete y sus subpaquetes. pero si anotamos la clase con @ComponentScan, entonces tenemos que proporcionar todos los paquetes que necesitamos, para que Spring verifique todas esas áreas.