Управление версиями stati c не работает с Spring Web Flow - PullRequest
2 голосов
/ 18 марта 2020

Срок действия кэша и управление версиями файла ресурсов работают корректно на всех страницах. Но потоки, похоже, игнорируют конфигурацию Spring MVC.

Рабочий пример:

файлы ресурсов имеют версии

В Spring Web Flow:

отсутствуют файлы ресурсов с версиями

В классе WebMvcConfig:

@Configuration
@EnableCaching
@ConfigurationProperties("message")
public class WebMvcConfig implements WebMvcConfigurer, ServletContextAware {

    ...

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/resources/")
                .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
                .resourceChain(false)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"))
                .addTransformer(new CssLinkResourceTransformer());
    }

    @Bean
    public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
        return new ResourceUrlEncodingFilter();
    }

    ...
}

WebConfigClass:

@Configuration
@EnableWebMvc
public class WebFlowConfig extends AbstractFlowConfiguration {
    @Autowired
    private ViewResolver viewResolver;
    @Autowired
    private RequestDataInterceptor requestDataInterceptor;
    @Autowired
    private LocalValidatorFactoryBean validator;

    // WEB FLOW
    @Bean
    public FlowExecutor flowExecutor() {
        return getFlowExecutorBuilder(flowRegistry()).addFlowExecutionListener(new SecurityFlowExecutionListener(), "*").build();
    }

    @Bean
    public FlowDefinitionRegistry flowRegistry() {
        return getFlowDefinitionRegistryBuilder(flowBuilderServices()).setBasePath("/WEB-INF/flows/").addFlowLocationPattern("/**/*-flow.xml").build();
    }

    @Bean
    public FlowBuilderServices flowBuilderServices() {
        return getFlowBuilderServicesBuilder().setViewFactoryCreator(mvcViewFactoryCreator()).setValidator(validator).setDevelopmentMode(true).setConversionService(getDefaultConversionService()).build();
    }

    private DefaultConversionService getDefaultConversionService() {
        final DefaultConversionService service = new DefaultConversionService();
        final FormattingConversionService delegateConversionService = (FormattingConversionService) service.getDelegateConversionService();
        delegateConversionService.removeConvertible(String.class, Number.class);
        delegateConversionService.addConverterFactory(new StringToNumberConverterFactory());
        delegateConversionService.addConverter(new TrimStringConverter());
        return service;
    }

    // MVC
    @Bean
    public FlowHandlerMapping flowHandlerMapping() {
        final FlowHandlerMapping mapping = new FlowHandlerMapping();
        mapping.setOrder(0);
        mapping.setFlowRegistry(this.flowRegistry());
        mapping.setInterceptors(requestDataInterceptor);
        return mapping;
    }

    @Bean
    public FlowHandlerAdapter flowHandlerAdapter() {
        final FlowHandlerAdapter adapter = new FlowHandlerAdapter();
        adapter.setFlowExecutor(this.flowExecutor());
        adapter.setSaveOutputToFlashScopeOnRedirect(true);
        return adapter;
    }

    @Bean
    public MvcViewFactoryCreator mvcViewFactoryCreator() {
        final MvcViewFactoryCreator factoryCreator = new MvcViewFactoryCreator();
        factoryCreator.setViewResolvers(Lists.newArrayList(this.viewResolver));
        factoryCreator.setUseSpringBeanBinding(true);
        return factoryCreator;
    }
}

В конфигурации безопасности:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    ... 

    @Override
    public void configure(final WebSecurity web) {
        web.ignoring().antMatchers("/resources/**");
    }

    ...
}

В jsp файлах (включая поток):

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
...
<!-- jQuery -->
<script type="text/javascript" src="<c:url value="/resources/scripts/libs/jquery-3.3.1.js"/>"></script>
<script type="text/javascript" src="<c:url value="/resources/scripts/jquery-validation/jquery.validate.js"/>"></script>
<script type="text/javascript" src="<c:url value="/resources/scripts/jquery-numbers/jquery.number.min.js"/>"></script>
...

Есть какие-нибудь идеи о том, как применить управление версиями активов c к потокам?

1 Ответ

1 голос
/ 19 марта 2020

мой способ справиться с этим:

<spring:eval expression="@applicationProperties.resourcesVersion" var="resourcesVersion"/>
<head>
    <style type="text/css" media='screen,print'>
        @import url("<c:url value="/resources/css-framework/css/tools.css?v=${resourcesVersion}" />");
    </style>
    <script type="text/javascript" src="<c:url value="/resources/spring/Spring.js?v=${resourcesVersion}" />"></script>
</head>

ApplicationProperties:

@Named
public class ApplicationProperties {

    ....

    private Long resourcesVersion = System.currentTimeMillis();

    public Long getResourcesVersion() {
        return resourcesVersion;
    }
}
...