Spring(带玉)资源
Spring (with Jade) Resources
问题
我的 spring-boot 应用程序最近将路由从 host/endpoint 更改为 host/middle/endpoint。自更改以来,我 运行 遇到了一个问题,即找不到与新 url 结构相关的资源。以前,我可以参考 css 样式表 link(rel='stylesheet', href='css/style.css') 等资源,但现在记录器显示一条错误消息,指出无法在 /middleman/css/style.css 找到资源。
根据我的研究,我发现我需要做的是使用资源处理程序注册表。我已经创建了一个(如下所示)但它似乎没有用。我认为问题在于,即使我现在拥有资源注册表,我也没有在注册表中引用资源。解决这个问题并让所有资源从同一个地方加载而不考虑端点的正确方法是什么?我很可能遗漏了一些明显的 SOP
注意:这都是我项目的简化表示,目的是在不提供不必要信息的情况下给出正在发生的事情的想法。
项目结构
src
main
java
com.mystuff.cool
configurations
ResourceConfiguration.java
controllers
RoutingController.java
application
Application.java
resources
static
css
footer.css
style.css
images
place1.png
location1.png
spot1.png
favicon.ico
javascripts
layout.js
templates
home.jade
申请Class
@ComponentScan(basePackages = {"my.packages"})
@EnableAutoConfiguration
@EnableSAMLSSO
@Configuration
public class Application
{
public static void main(String[] args)
{
SpringApplication.run(new Object[]{ Application.class, ServiceConfig.class, ResourceConfiguration.class}, args);
}
}
资源配置
@EnableWebMvc
@Configuration
public class ResourceConfiguration extends WebMvcConfigurerAdapter
{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
{
configurer.enable();
}
}
控制器
@Controller
public class RoutingController
{
@RequestMapping("/house/home")
public String home(Model model)
{
model.addAttribute("title", "Home is where the heart is");
commonModelTribs(model);
return "home";
}
}
首页
doctype html
html
title Place-spedia #{title}
link(rel='icon', href='images/favicon.ico')
link(rel='stylesheet', href='css/style.css')
script(src='javascripts/layout.js')
link(rel='stylesheet', href='css/footer.css')
body
div#footer-icons
a(href='place1')
img#place1(src="images/place1.png")
a(href='location1')
img#location1(src="images/location1.png")
a(href='spot1')
img#spot1(src='images/spot1.png')
如果您使用的是spring 引导,则无需担心资源配置,因为您已经通过自动配置配置了资源目录。自动配置的默认行为是在 resources/static
.
内查找
您的问题与您的 href 值有关,请尝试插入前导正斜杠:
link(rel='icon', href='/images/favicon.ico')
link(rel='stylesheet', href='/css/style.css')
script(src='javascripts/layout.js')
link(rel='stylesheet', href='/css/footer.css')
Spring 将您的应用程序路由到一个新的相对路径,因此通过将前导 /
放在您的 href
属性中,您告诉路由器绝对在 static
目录而不是相对于 middle
目录。
问题
我的 spring-boot 应用程序最近将路由从 host/endpoint 更改为 host/middle/endpoint。自更改以来,我 运行 遇到了一个问题,即找不到与新 url 结构相关的资源。以前,我可以参考 css 样式表 link(rel='stylesheet', href='css/style.css') 等资源,但现在记录器显示一条错误消息,指出无法在 /middleman/css/style.css 找到资源。
根据我的研究,我发现我需要做的是使用资源处理程序注册表。我已经创建了一个(如下所示)但它似乎没有用。我认为问题在于,即使我现在拥有资源注册表,我也没有在注册表中引用资源。解决这个问题并让所有资源从同一个地方加载而不考虑端点的正确方法是什么?我很可能遗漏了一些明显的 SOP
注意:这都是我项目的简化表示,目的是在不提供不必要信息的情况下给出正在发生的事情的想法。
项目结构
src
main
java
com.mystuff.cool
configurations
ResourceConfiguration.java
controllers
RoutingController.java
application
Application.java
resources
static
css
footer.css
style.css
images
place1.png
location1.png
spot1.png
favicon.ico
javascripts
layout.js
templates
home.jade
申请Class
@ComponentScan(basePackages = {"my.packages"})
@EnableAutoConfiguration
@EnableSAMLSSO
@Configuration
public class Application
{
public static void main(String[] args)
{
SpringApplication.run(new Object[]{ Application.class, ServiceConfig.class, ResourceConfiguration.class}, args);
}
}
资源配置
@EnableWebMvc
@Configuration
public class ResourceConfiguration extends WebMvcConfigurerAdapter
{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
{
configurer.enable();
}
}
控制器
@Controller
public class RoutingController
{
@RequestMapping("/house/home")
public String home(Model model)
{
model.addAttribute("title", "Home is where the heart is");
commonModelTribs(model);
return "home";
}
}
首页
doctype html
html
title Place-spedia #{title}
link(rel='icon', href='images/favicon.ico')
link(rel='stylesheet', href='css/style.css')
script(src='javascripts/layout.js')
link(rel='stylesheet', href='css/footer.css')
body
div#footer-icons
a(href='place1')
img#place1(src="images/place1.png")
a(href='location1')
img#location1(src="images/location1.png")
a(href='spot1')
img#spot1(src='images/spot1.png')
如果您使用的是spring 引导,则无需担心资源配置,因为您已经通过自动配置配置了资源目录。自动配置的默认行为是在 resources/static
.
您的问题与您的 href 值有关,请尝试插入前导正斜杠:
link(rel='icon', href='/images/favicon.ico')
link(rel='stylesheet', href='/css/style.css')
script(src='javascripts/layout.js')
link(rel='stylesheet', href='/css/footer.css')
Spring 将您的应用程序路由到一个新的相对路径,因此通过将前导 /
放在您的 href
属性中,您告诉路由器绝对在 static
目录而不是相对于 middle
目录。