Cor*_*eyS 148 java spring spring-mvc spring-boot
我试图以编程方式设置Spring Boot应用程序上下文根.上下文根的原因是我们希望从中访问应用程序localhost:port/{app_name}
并将所有控制器路径附加到它.
这是web-app的应用程序配置文件.
@Configuration
public class ApplicationConfiguration {
Logger logger = LoggerFactory.getLogger(ApplicationConfiguration.class);
@Value("${mainstay.web.port:12378}")
private String port;
@Value("${mainstay.web.context:/mainstay}")
private String context;
private Set<ErrorPage> pageHandlers;
@PostConstruct
private void init(){
pageHandlers = new HashSet<ErrorPage>();
pageHandlers.add(new ErrorPage(HttpStatus.NOT_FOUND,"/notfound.html"));
pageHandlers.add(new ErrorPage(HttpStatus.FORBIDDEN,"/forbidden.html"));
}
@Bean
public EmbeddedServletContainerFactory servletContainer(){
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
logger.info("Setting custom configuration for Mainstay:");
logger.info("Setting port to {}",port);
logger.info("Setting context to {}",context);
factory.setPort(Integer.valueOf(port));
factory.setContextPath(context);
factory.setErrorPages(pageHandlers);
return factory;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
}
Run Code Online (Sandbox Code Playgroud)
这是主页面的索引控制器.
@Controller
public class IndexController {
Logger logger = LoggerFactory.getLogger(IndexController.class);
@RequestMapping("/")
public String index(Model model){
logger.info("Setting index page title to Mainstay - Web");
model.addAttribute("title","Mainstay - Web");
return "index";
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序的新根应该在localhost:12378/mainstay
,但它仍然位于localhost:12378
.
我错过了什么导致Spring Boot在请求映射之前没有附加上下文根?
M. *_*num 347
你为什么要尝试推出自己的解决方案.Spring-boot已经支持了.
如果您还没有,请添加application.properties
文件src\main\resources
.在该属性文件中,添加2个属性:
server.contextPath=/mainstay
server.port=12378
Run Code Online (Sandbox Code Playgroud)
更新(Spring Boot 2.0)
从Spring Boot 2.0开始(由于Spring MVC和Spring WebFlux的支持),contextPath
已经更改为以下内容:
server.servlet.contextPath=/mainstay
Run Code Online (Sandbox Code Playgroud)
然后,您可以删除自定义servlet容器的配置.如果需要对容器进行一些后处理,可以EmbeddedServletContainerCustomizer
在配置中添加实现(例如添加错误页面).
基本上,application.properties
作为默认服务器内部的属性,您始终可以通过使用application.properties
您提供的工件旁边的其他属性或通过添加JVM参数(-Dserver.port=6666
)来覆盖它们.
该类ServerProperties
实现了EmbeddedServletContainerCustomizer
.默认contextPath
是""
.在您的代码示例中,您将contextPath
直接在上面设置TomcatEmbeddedServletContainerFactory
.接下来,ServerProperties
实例将处理此实例并将其从您的路径重置为""
.(此行进行null
检查,但默认情况下""
它始终失败并将上下文设置为""
并因此覆盖您的上下文).
Abh*_*hah 28
如果您使用的是Spring Boot,那么您不必通过Vean初始化来配置服务器属性.
相反,如果一个功能可用于基本配置,则可以在调用的"属性"文件中进行设置,该文件application
应位于src\main\resources
应用程序结构中."属性"文件有两种格式
.yml
.properties
指定或设置配置的方式因格式而异.
在您的特定情况下,如果您决定使用该扩展.properties
,那么您将拥有一个名为application.properties
under 的文件,src\main\resources
其中包含以下配置设置
server.port = 8080
server.contextPath = /context-path
Run Code Online (Sandbox Code Playgroud)
OTOH,如果您决定使用.yml
扩展名(即application.yml
),则需要使用以下格式设置配置(即YAML
):
server:
port: 8080
contextPath: /context-path
Run Code Online (Sandbox Code Playgroud)
有关Spring Boot的更常见属性,请参阅以下链接:
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
mag*_*llo 18
如果使用Spring Boot 2.0.0,请使用:
server.servlet.context-path
Run Code Online (Sandbox Code Playgroud)
请注意,"server.context-path"或"server.servlet.context-path"[从springboot 2.0.x开始]属性仅在部署到嵌入式容器(例如嵌入式tomcat)时才有效.如果您将应用程序作为战争部署到外部tomcat,则这些属性将不起作用.
在这里看到这个答案:https://stackoverflow.com/a/43856300/4449859
正确的属性是
server.servlet.path
Run Code Online (Sandbox Code Playgroud)
配置DispatcherServlet的路径
和
server.servlet.context-path
Run Code Online (Sandbox Code Playgroud)
在下面配置应用程序上下文的路径.
如果您使用 spring-boot-starter-webflux 使用:
spring:
webflux:
base-path: /api
Run Code Online (Sandbox Code Playgroud)
我向上帝发誓……我每次都忘记这一点。
您可以通过轻松添加端口和上下文路径来在 [src\main\resources] .properties 文件和 .yml 文件中添加配置来完成此操作
application.porterties 文件配置
server.port = 8084
server.contextPath = /context-path
Run Code Online (Sandbox Code Playgroud)
application.yml 文件配置
server:
port: 8084
contextPath: /context-path
Run Code Online (Sandbox Code Playgroud)
我们还可以在 Spring Boot 中以编程方式更改它。
@Component
public class ServerPortCustomizer implements WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {
@Override
public void customize(EmbeddedServletContainerCustomizer factory) {
factory.setContextPath("/context-path");
factory.setPort(8084);
}
Run Code Online (Sandbox Code Playgroud)
}
我们还可以添加另一种方式
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {SpringApplication application = new pringApplication(MyApplication.class);
Map<String, Object> map = new HashMap<>();
map.put("server.servlet.context-path", "/context-path");
map.put("server.port", "808");
application.setDefaultProperties(map);
application.run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
使用java命令spring boot 1.X
java -jar my-app.jar --server.contextPath=/spring-boot-app --server.port=8585
Run Code Online (Sandbox Code Playgroud)
使用java命令spring boot 2.X
java -jar my-app.jar --server.servlet.context-path=/spring-boot-app --server.port=8585
Run Code Online (Sandbox Code Playgroud)
如果您使用 application.yml 和 spring 2.0 以上版本,请按以下方式配置。
server:
port: 8081
servlet:
context-path: /demo-api
Run Code Online (Sandbox Code Playgroud)
现在所有 API 调用都将类似于 http://localhost:8081/demo-api/
归档时间: |
|
查看次数: |
266104 次 |
最近记录: |