Skip to content

Spring Boot not working well with the new ResourceTransformer in Spring 4.1 #2360

Closed
@csavory

Description

@csavory

Recently I introduced the new ResourceTransformer into our application for JS and CSS files. In my WebConfig I overrode the addResourceHandlers method. and added the following code:

    @Override
    public void addResourceHandlers( ResourceHandlerRegistry registry ) {

        boolean localMode = this.env.acceptsProfiles( "local" );

        //String location = localMode ? "file:///" + getProjectRootRequired() + "/client/src/" : "classpath:/static/"; 
        String location = "classpath:/static/";
        Integer cachePeriod = this.resourceProperties.getCachePeriod();
        boolean useResourceCache = !localMode;
        String version = localMode ? "local" : this.appVersion;

        AppCacheManifestTransformer appCacheTransformer = new AppCacheManifestTransformer();
        LessLinkResourceTransformer lessLinkResourceTransformer = new LessLinkResourceTransformer();
        VersionResourceResolver versionResolver = new VersionResourceResolver()
                //.addFixedVersionStrategy( version, "/**/*.js" ) //Enable this if we use a JavaScript module loader
                .addContentVersionStrategy( "/**" );

        //A Handler With Versioning
        registry.addResourceHandler( "/**/*.js", "/**/*.css", "/**/*.less", "/**/*.png", "/**/*.gif", "/**/*.jpg", "/**/*.map" )
                .addResourceLocations( location )
                .setCachePeriod( this.fingerprintedCachePeriod )
                .resourceChain( useResourceCache )
                .addResolver( versionResolver )
                .addTransformer( appCacheTransformer )
                .addTransformer( lessLinkResourceTransformer );
    }

I added the ResourceUrlEncodingFilter as it says to do in the Spring 4.1 docs. Then when I tested my app I realized that the CSS files were being versioned, but the JS files were not being versioned. After a lot of debugging, I realized that the problem was in ResourceUrlEncodingFilter.getForLookupPath. It loops through all the handler mappings and uses the first one that matches with AntMatcher. My CSS links were being matched to my mapping that I added in my WebConfig, but my JS links were always getting picked up by another mapping ("/") that did not include a version transformer. I finally tracked this mapping to the one that was added in WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter.addResourceHandlers. This was a huge pain since the ResourceHandlerRegistry API does not allow you to remove existing handlers, but only add new ones. I didn't want a to overwrite "/" since I didn't want all my links transformed. The only temporary solution I could come up with was to make my WebConfig extend WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter so that WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter.addResourceHandlers would not get called. Then I added another ResourceHandler to my addResourceHandlers for the static resources I did not want versioned.

I don't think this is a good long term solution for us, but it works for the mean time.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions