VersionResourceResolver 不起作用

Him*_*agi 5 java version-control spring jsp spring-mvc

我的 spring 应用程序中有这样的静态资源结构:

\src
    \main
        \webapp
           \resouces
              \css\..
              \js\..
Run Code Online (Sandbox Code Playgroud)

并像这样配置了 VersionResourceResolver :

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/")
                .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)).resourceChain(true)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
    }
Run Code Online (Sandbox Code Playgroud)

我在我的 jsp 中使用 jstl 包含了资源:

<script type="text/javascript" src="<c:url value="/resources/js/my.js"/>"></script>
Run Code Online (Sandbox Code Playgroud)

但是当我运行应用程序时,我看不到任何类型的版本控制。我错过了什么?

我也试过:

/sf/answers/2688535111/

但没有运气

更新

我包括这样的资源:

<link rel="stylesheet" href="<c:url value="/resources/css/mycss.css?v=2" />">
<script type="text/javascript" src="<c:url value="/resources/js/myjs.js?v=1"/>"></script>
Run Code Online (Sandbox Code Playgroud)

这就是正在生成的内容:

<link rel="stylesheet" href="/app/resources/css/mycss.css?v=2">
<script type="text/javascript" src="/app/resources/js/myjs.js?v=1"></script>
Run Code Online (Sandbox Code Playgroud)

索引页使用:

<welcome-file-list>
        <welcome-file>/WEB-INF/views/index.jsp</welcome-file>
    </welcome-file-list>
Run Code Online (Sandbox Code Playgroud)

控制器:用于家庭等...

@RequestMapping(value = "/home", method = RequestMethod.GET)
    public ModelAndView home(HttpServletRequest request, ModelMap model) {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

Arp*_*wal 4

可能ResourceUrlProvider is null适合你encodeURLResourceUrlEncodingFilter.ResourceUrlEncodingResponseWrapper

@Override
        public String encodeURL(String url) {
            ResourceUrlProvider resourceUrlProvider = getResourceUrlProvider();
            if (resourceUrlProvider == null) {
                logger.debug("Request attribute exposing ResourceUrlProvider not found");
                return super.encodeURL(url);
            }
            initIndexLookupPath(resourceUrlProvider);
            if (url.length() >= this.indexLookupPath) {
                String prefix = url.substring(0, this.indexLookupPath);
                int suffixIndex = getQueryParamsIndex(url);
                String suffix = url.substring(suffixIndex);
                String lookupPath = url.substring(this.indexLookupPath, suffixIndex);
                lookupPath = resourceUrlProvider.getForLookupPath(lookupPath);
                if (lookupPath != null) {
                    return super.encodeURL(prefix + lookupPath + suffix);
                }
            }
            return super.encodeURL(url);
        }
Run Code Online (Sandbox Code Playgroud)

要修复此问题,请ResourceUrlEncodingFilterweb.xml或 中注册WebApplicationInitializer,如下所示:

    <filter>
        <filter-name>resourceUrlEncodingFilter</filter-name>
        <filter-class>
            org.springframework.web.servlet.resource.ResourceUrlEncodingFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>resourceUrlEncodingFilter</filter-name>
        <servlet-name>spring-dispatcher</servlet-name>
    </filter-mapping> 
Run Code Online (Sandbox Code Playgroud)

其中spring-dispatcherDispatcherServlet

    <servlet>
        <servlet-name>spring-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
Run Code Online (Sandbox Code Playgroud)

并确保您的内容my jsp是通过 呈现的spring-dispatcher,例如:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {

    @RequestMapping(value = "/my-jsp", method = RequestMethod.GET)
    public String home() {
        return "my";
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 GitHub 上创建了一个示例应用程序 - spring-resource-versioning,它可以回答您的进一步问题。

希望有帮助!

  • 老兄你摇滚_/\\_ (2认同)