Spring перестает обслуживать статические ресурсы после создания messageSource - PullRequest
2 голосов
/ 12 апреля 2019

После создания bean-компонента messageSource весной мое приложение webMvcConfigurer перестает обслуживать статические ресурсы (images / css / js) со статусом http 404, но все файлы имеют правильный путь (я полностью уверен, что ошибка где-то внутри 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 голосов
/ 12 апреля 2019

Я решил эту проблему, добавив источник сообщений в другой класс Configuration и добавив этот класс в dispatherServlet как ServletConfigClass

Другая конфигурация:

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

Класс сервлета:

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(""));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...