创建messageSource后,Spring停止提供静态资源

时间:2019-04-11 21:01:22

标签: spring spring-mvc

在spring webMvcConfigurer中创建creatig messageSource bean之后,我的应用程序停止以http状态404提供静态资源(图像/ css / js),但是所有文件都具有正确的路径(我完全确定messageSource中的某个错误,因为没有此bean投放正常)。也许您知道如何解决此问题?

我的WebMvcConfigurerImpl:

@Configuration
@Import({dbConfig.class})
@EnableWebMvc
@EnableSpringDataWebSupport
@ComponentScan("my.shop.common.fliPusto")
@PropertySource("classpath:properties/resources.properties")
public class mvcConfig implements WebMvcConfigurer {

    @Value("${uploadBook.path}")
    private String bookPath;

    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**")
                .addResourceLocations("file:/" + bookPath + "/images/");
        registry.addResourceHandler("/scripts/**")
                .addResourceLocations("file:/" + bookPath + "/scripts/");
        registry.addResourceHandler("/styles/**")
                .addResourceLocations("file:/" + bookPath + "/styles/");
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
    }

    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        configurer.setTemplateLoaderPath("classpath:freemarkerTemplates/");
        configurer.setDefaultEncoding("UTF-8");
        return configurer;
    }

    @Bean
    public FreeMarkerViewResolver freeMarkerViewResolver() {
        FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver();
        freeMarkerViewResolver.setCache(false);
        freeMarkerViewResolver.setPrefix("");
        freeMarkerViewResolver.setSuffix(".ftl");
        freeMarkerViewResolver.setContentType("text/html; charset=UTF-8");

        return freeMarkerViewResolver;
    }

    @Bean
    public MultipartResolver multipartResolver() {
        return new StandardServletMultipartResolver();
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }

    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("/messages/locales");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}

我的securityConfig:

@Configuration
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan(value = "my.shop.common.fliPusto.services")
public class securityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(4);
    }

    @Bean
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding("UTF-8");
        encodingFilter.setForceEncoding(true);
        encodingFilter.setForceRequestEncoding(true);
        encodingFilter.setForceResponseEncoding(true);

        return encodingFilter;
    }

    @Autowired
    void setAuthManagerBuilder(AuthenticationManagerBuilder authenticationManagerBuilder, PasswordEncoder passwordEncoder, UserDetailsService userDetailsService) {
        try {
            authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/", "/registration", "/test/*", "/book", "/tag/**", "/user/profile/{profile}", "/images/**", "/scripts/**", "/styles/**").permitAll()
                .antMatchers("/admin/**").hasAuthority("MODERATOR")
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .logoutSuccessUrl("/")
                .permitAll()
                .and()
                .requiresChannel()
                .anyRequest()
                .requiresSecure();

        http.addFilterBefore(characterEncodingFilter(), CsrfFilter.
    }
}

1 个答案:

答案 0 :(得分:0)

我通过将消息源添加到另一个Configuration类并将该类作为ServletConfigClass添加到dispatherServlet来解决了这个问题

另一个配置:

@Configuration
public class OtherConfig {
    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new 
ResourceBundleMessageSource();
        messageSource.setBasename("/messages/locales");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}

Servlet类:

public class servlet extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {mvcConfig.class, securityConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {OtherConfig.class};      <-------------There
    }

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

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[]{new charsetFilter()};
    }

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setMultipartConfig(new MultipartConfigElement(""));
    }
}