เพิ่มเส้นทางบริบทให้กับแอปพลิเคชัน Spring Boot


174

ฉันกำลังพยายามตั้งค่ารูทบริบทของแอปพลิเคชัน Spring Boot โดยทางโปรแกรม เหตุผลสำหรับรูทบริบทคือเราต้องการให้แอปเข้าถึงได้localhost:port/{app_name}และให้พา ธ คอนโทรลเลอร์ทั้งหมดต่อท้าย

นี่คือไฟล์กำหนดค่าแอปพลิเคชันสำหรับเว็บแอป

@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;
  }
}

นี่คือตัวควบคุมดัชนีสำหรับหน้าหลัก

@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";
  }

}

รากใหม่ของโปรแกรมควรมีอย่างแต่มันก็ยังคงอยู่ที่localhost:12378/mainstaylocalhost:12378

ฉันพลาดอะไรที่ทำให้ Spring Boot ไม่ต่อท้ายรูทบริบทก่อนที่จะทำการแมปคำขอ

คำตอบ:


382

ทำไมคุณจึงพยายามที่จะแก้ปัญหาของคุณเอง Spring-boot รองรับแล้ว

ถ้าคุณไม่ได้หนึ่งเพิ่มไฟล์ไปยังapplication.properties src\main\resourcesในไฟล์คุณสมบัตินั้นให้เพิ่ม 2 คุณสมบัติ:

server.contextPath=/mainstay
server.port=12378

อัปเดต (Spring Boot 2.0)

ตั้งแต่ Spring Boot 2.0 (เนื่องจากรองรับทั้ง Spring MVC และ Spring WebFlux) contextPathจึงมีการเปลี่ยนแปลงดังต่อไปนี้:

server.servlet.contextPath=/mainstay

จากนั้นคุณสามารถลบคอนฟิกูเรชันของคุณสำหรับคอนเทนเนอร์เซิร์ฟเล็ตแบบกำหนดเอง หากคุณต้องการทำการโพสต์บนคอนเทนเนอร์คุณสามารถเพิ่มEmbeddedServletContainerCustomizerการนำไปใช้กับการกำหนดค่าของคุณ (ตัวอย่างเช่นเพื่อเพิ่มหน้าข้อผิดพลาด)

โดยทั่วไปคุณสมบัติในการapplication.propertiesให้บริการเป็นค่าเริ่มต้นคุณสามารถแทนที่ได้โดยใช้คุณสมบัติapplication.propertiesถัดจากสิ่งประดิษฐ์ที่คุณส่งมอบหรือโดยการเพิ่มพารามิเตอร์ JVM ( -Dserver.port=6666)

ดูคู่มืออ้างอิงโดยเฉพาะอย่างยิ่งส่วนคุณสมบัติ

ชั้นดำเนินการServerProperties EmbeddedServletContainerCustomizerค่าเริ่มต้นสำหรับมีcontextPath ""ในตัวอย่างของรหัสของคุณคุณจะตั้งค่าโดยตรงบนcontextPath TomcatEmbeddedServletContainerFactoryถัดไปตัวอย่างเช่นจะดำเนินการเช่นนี้และตั้งค่าได้จากเส้นทางของคุณไปServerProperties ""( บรรทัดนี้ทำการnullตรวจสอบ แต่ตามค่าเริ่มต้นคือ""มันล้มเหลวเสมอและตั้งค่าบริบทเป็น""และแทนที่ของคุณ)


คำตอบของคุณไม่ถูกต้อง (ฉันหมายถึงคุณสามารถกำหนดคุณสมบัติภาชนะ servlet เองโดยใช้ไฟล์คุณสมบัติของแอปพลิเคชัน) ทำไมมีวิธี setContextPath (เส้นทาง) ฉันหมายความว่าถ้าเส้นทางไม่ได้บังคับใช้มันเป็นสิ่งที่ดี? BTW เช่นเดียวกันสำหรับ setContextPath (... ) บน EmbeddedServletContainerCustomizer
Modi

2
ฉันคาดหวังจากEmbeddedServletContainerCustomizerการทำงาน แต่ฉันจะไปในสิ่งที่มีให้แทนที่จะพยายามที่จะโบลต์ด้วยตัวคุณเอง ทำไมแก้ปัญหาของคุณไม่ได้ทำงานจะทำอย่างไรกับการทำงานเริ่มต้นโปรแกรม (ตั้งใจ) ในServerPropertiesเริ่มต้นการกำหนดค่าcontextPathเป็น""(และก็ตรวจสอบnullและไม่ได้""แทนที่หลังของคุณกำหนดอย่างชัดเจน. contextPath.
เอ็ม Deinum

คุณสมบัติมีการเปลี่ยนแปลงโปรดดูคำตอบของฉันด้านล่าง
Michael Simons

5
ฉันเดาคุณสมบัติใน Spring Boot 2.0 คือ "server.servlet.context-path"
IamVickyAV

34

หากคุณกำลังใช้ Spring Boot คุณไม่จำเป็นต้องกำหนดค่าคุณสมบัติเซิร์ฟเวอร์ผ่านการเริ่มต้น Vean

หากมีฟังก์ชั่นการใช้งานพื้นฐานสำหรับการตั้งค่าพื้นฐานคุณสามารถตั้งค่าในไฟล์ "คุณสมบัติ" applicationซึ่งควรจะอยู่ภายใต้src\main\resourcesโครงสร้างแอปพลิเคชันของคุณ ไฟล์ "คุณสมบัติ" มีอยู่ในสองรูปแบบ

  1. .yml

  2. .properties

วิธีที่คุณระบุหรือตั้งค่าการกำหนดค่าแตกต่างจากรูปแบบหนึ่งเป็นอีกรูปแบบหนึ่ง

ในกรณีเฉพาะของคุณหากคุณตัดสินใจที่จะใช้ส่วนขยาย.propertiesคุณจะต้องมีไฟล์ชื่อapplication.propertiesภายใต้src\main\resourcesการตั้งค่าการกำหนดค่าต่อไปนี้

server.port = 8080
server.contextPath = /context-path

OTOH หากคุณตัดสินใจใช้.ymlส่วนขยาย (เช่นapplication.yml) คุณจะต้องตั้งค่าการกำหนดค่าโดยใช้รูปแบบต่อไปนี้ (เช่นYAML):

server:
    port: 8080
    contextPath: /context-path

สำหรับคุณสมบัติทั่วไปเพิ่มเติมของ Spring Boot โปรดอ้างถึงลิงก์ด้านล่าง:

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html


22

หากคุณใช้ Spring Boot 2.0.0 ให้ใช้:

server.servlet.context-path

2
สิ่งนี้ใช้ไม่ได้กับไฟล์สงครามที่ปรับใช้ในคราวภายนอก
pise

1
สำหรับผมนี้ไม่ได้ทำงาน (ฤดูใบไม้ผลิ Boot 2.1.2) แต่ไม่ทำงานนี้:server.servlet.contextPath=/api
lospejos

2
@pise คุณรู้วิธีแก้ไขไฟล์ war ใน tomcat ภายนอกหรือไม่
mohax

11

โปรดทราบว่าคุณสมบัติ "server.context-path" หรือ "server.servlet.context-path" [เริ่มต้นจาก springboot 2.0.x] จะทำงานได้ก็ต่อเมื่อคุณกำลังปรับใช้กับคอนเทนเนอร์ที่ฝังตัวเช่น tomcat ฝังตัว คุณสมบัติเหล่านี้จะไม่มีผลกระทบหากคุณปรับใช้แอปพลิเคชันของคุณเป็นสงครามกับแมวตัวผู้ภายนอก

ดูคำตอบนี้ได้ที่นี่: https://stackoverflow.com/a/43856300/4449859


มีใครคิดวิธีการกำหนดค่านี้เมื่อปรับใช้กับคราวภายนอกเป็นwarไฟล์ที่ใช้springboot v2.xและtomcat v8.5?
Simple-Solution

@abdel แม้ฉันกำลังมองหาคำตอบจะเกิดอะไรขึ้นถ้าเรากำลังปรับใช้ไฟล์ war ใน tomcat ภายนอกวิธีกำหนดเส้นทางบริบท
pise

ฉันพยายามแล้ว มันเหมือนกับสิ่งที่ระบุไว้ในลิงค์ด้านบน เปลี่ยนค่าแอ็ตทริบิวต์ build -> finalName เป็นพา ธ บริบทของคุณ ไฟล์สงครามที่เกิดขึ้นจะใช้เส้นทางบริบทเป็นชื่อไฟล์ซึ่งจะใช้โดย Tomcat เพื่อทำหน้าที่เป็นเส้นทางบริบท
DriLLFreAK100

วิธีเดียวที่ฉันสามารถคิดสำหรับการปรับใช้เป็นสงครามในคราวภายนอกคือเพื่อให้แน่ใจว่าชื่อสงครามตรงกับบริบทที่คุณอยู่หลัง ตัวอย่างเช่นหากคุณต้องการให้บริบทเป็น '/ xyzwebapp' ดังนั้นสงครามของคุณจะต้องมีชื่อว่า xyzwebapp.war เพื่อให้บรรลุสิ่งนี้คุณสามารถเพิ่มสิ่งต่อไปนี้ลงในองค์ประกอบ <build> ใน pom.xml ของคุณ: <finalName> xyzwebapp </finalName>
abdel

9

คุณสมบัติที่ถูกต้องคือ

server.servlet.path

เพื่อกำหนดค่าเส้นทางของ DispatcherServlet

และ

server.servlet.context-path

เพื่อกำหนดค่าพา ธ ของบริบทแอปพลิเคชันด้านล่าง


ขอบคุณมาก
hema chandra

2

เราสามารถเปลี่ยนเส้นทางรูทบริบทโดยใช้รายการอย่างง่ายในไฟล์คุณสมบัติ

application.properties

### Spring boot 1.x #########
server.contextPath=/ClientApp

### Spring boot 2.x #########
server.servlet.context-path=/ClientApp

1

เราสามารถตั้งค่าในapplication.propertiesเป็น API_CONTEXT_ROOT=/therootpath

และเราเข้าถึงมันในคลาส Java ตามที่ระบุไว้ด้านล่าง

@Value("${API_CONTEXT_ROOT}")
private String contextRoot;

1

server.contextPath = / แกนนำ

เหมาะกับฉันถ้าฉันมีไฟล์สงครามหนึ่งไฟล์ใน JBOSS ในบรรดาไฟล์สงครามหลายไฟล์ซึ่งแต่ละไฟล์มี jboss-web.xml มันไม่ทำงาน ฉันต้องใส่ jboss-web.xml ไว้ในไดเรกทอรี WEB-INF พร้อมเนื้อหา

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd">
    <context-root>mainstay</context-root>
</jboss-web>

1

ใน Spring Boot 1.5:

เพิ่มคุณสมบัติต่อไปนี้ในapplication.properties:

server.context-path=/demo

หมายเหตุ: /demoเป็น URL เส้นทางบริบทของคุณ


1

คุณสามารถทำได้โดยเพิ่มพอร์ตและ contextpath อย่างง่ายดายเพื่อเพิ่มการกำหนดค่าในไฟล์ [src \ main \ resources] .properties และไฟล์ .yml

การกำหนดค่าไฟล์ application.porperties

server.port = 8084
server.contextPath = /context-path

การกำหนดค่าไฟล์ application.yml

server:
port: 8084
contextPath: /context-path

นอกจากนี้เรายังสามารถเปลี่ยนโปรแกรมในการบูตฤดูใบไม้ผลิ

@Component
public class ServerPortCustomizer implements     WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {

@Override
public void customize(EmbeddedServletContainerCustomizer factory) {
    factory.setContextPath("/context-path");
    factory.setPort(8084);
}

}

เราสามารถเพิ่มวิธีอื่นได้เช่นกัน

@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);
    }       
}

การใช้คำสั่ง java boot spring 1.X

java -jar my-app.jar --server.contextPath=/spring-boot-app     --server.port=8585 

การใช้คำสั่ง java boot spring 2.X

java -jar my-app.jar --server.servlet.context-path=/spring-boot-app --server.port=8585 

นอกจากนี้เรายังสามารถเพิ่มเซิร์ฟเวอร์พอร์ตโดยทางโปรแกรม
Ghulam Murtaza

0

หากคุณใช้ application.yml และเวอร์ชั่นฤดูใบไม้ผลิข้างต้น 2.0 ให้กำหนดค่าในลักษณะด้านล่าง

server:
  port: 8081
  servlet:
     context-path: /demo-api

ตอนนี้การเรียก API ทั้งหมดจะเป็นเหมือนhttp: // localhost: 8081 / demo-api /


0

WebServerFactoryCustomizerเราสามารถตั้งค่าได้โดยใช้ สามารถเพิ่มได้โดยตรงในคลาสเมธอด main boot หลักซึ่งเริ่มต้นด้วย Spring ApplicationContext

@Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
      webServerFactoryCustomizer() {
        return factory -> factory.setContextPath("/demo");
}

0

หากคุณใช้ Spring Boot 2.x และต้องการผ่านคุณสมบัติเส้นทางบริบทในบรรทัดคำสั่งคุณควรใส่ double // ดังนี้:

--server.servlet.context-path=//your-path

ที่ทำงานให้ฉันทำงานใน windows


0
<!-- Server port-->

server.port=8080

<!--Context Path of the Application-->

server.servlet.context-path=/ems

พอร์ตของเซิร์ฟเวอร์จะเป็น 8080 ถ้าคุณต้องการพอร์ตอื่นคุณสามารถแทนที่ 8080 ได้เส้นทางบริบทของแอปพลิเคชันเทียว ๆ ฉันได้ตั้งค่า ems แล้ว คุณสามารถกำหนดเส้นทางอื่นตามความต้องการของคุณ
Bordoloi Parth

1
นั่นเป็นข้อมูลที่มีประโยชน์ทำไมคุณไม่เพิ่มเข้าไปในคำตอบของคุณแทนที่จะแสดงความคิดเห็น?
k-den

0

ต้องเป็น: server.servlet.context-path = / demo หมายเหตุว่าไม่มีเครื่องหมายคำพูดเฉพาะค่าที่นำหน้าด้วย '/' ค่านี้จะอยู่ในไฟล์ application.properties ของคุณ


-1

บริบทเส้นทางสามารถรวมเข้ากับรหัสได้โดยตรง แต่ไม่แนะนำให้ใช้เนื่องจากไม่สามารถนำมาใช้ซ้ำได้ดังนั้นให้เขียนในไฟล์ไฟล์ application.properties server.contextPath = / ชื่อของโฟลเดอร์ที่คุณวางรหัส contextPath = ชื่อของโฟลเดอร์ที่คุณวางไว้ รหัส / หมายเหตุ: ดูเครื่องหมายทับอย่างระมัดระวัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.