Thêm đường dẫn ngữ cảnh vào ứng dụng Spring Boot


174

Tôi đang cố gắng thiết lập một bối cảnh ứng dụng Spring Boot theo chương trình. Lý do cho gốc ngữ cảnh là chúng tôi muốn ứng dụng được truy cập từ đó localhost:port/{app_name}và có tất cả các đường dẫn bộ điều khiển nối với nó.

Đây là tập tin cấu hình ứng dụng cho ứng dụng web.

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

Đây là bộ điều khiển chỉ mục cho trang chính.

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

}

Root mới của ứng dụng nên có localhost:12378/mainstay, nhưng nó vẫn nằm ở localhost:12378.

Tôi còn thiếu điều gì khiến Spring Boot không nối thêm gốc ngữ cảnh trước khi ánh xạ yêu cầu?

Câu trả lời:


381

Tại sao bạn đang cố gắng để cuộn giải pháp của riêng bạn. Spring-boot đã hỗ trợ điều đó.

Nếu bạn chưa có, hãy thêm một application.propertiestệp vào src\main\resources. Trong tệp thuộc tính đó, thêm 2 thuộc tính:

server.contextPath=/mainstay
server.port=12378

CẬP NHẬT (Spring Boot 2.0)

Kể từ Spring Boot 2.0 (do sự hỗ trợ của cả Spring MVC và Spring WebFlux), contextPathđã được thay đổi thành như sau:

server.servlet.contextPath=/mainstay

Sau đó, bạn có thể xóa cấu hình của mình cho thùng chứa servlet tùy chỉnh. Nếu bạn cần thực hiện một số xử lý bài đăng trên vùng chứa, bạn có thể thêm EmbeddedServletContainerCustomizercài đặt vào cấu hình của mình (ví dụ để thêm các trang lỗi).

Về cơ bản các thuộc tính bên trong application.propertiesphục vụ như một mặc định, bạn luôn có thể ghi đè chúng bằng cách sử dụng một thuộc tính khác application.propertiesbên cạnh tạo phẩm bạn phân phối hoặc bằng cách thêm các tham số JVM ( -Dserver.port=6666).

Xem thêm Hướng dẫn tham khảo đặc biệt là phần thuộc tính .

Các lớp ServerPropertiesthực hiện EmbeddedServletContainerCustomizer. Mặc định cho contextPath"". Trong mẫu mã của bạn, bạn đang thiết lập contextPathtrực tiếp trên TomcatEmbeddedServletContainerFactory. Tiếp theo ServerPropertiescá thể sẽ xử lý thể hiện này và đặt lại nó từ đường dẫn của bạn tới "". ( Dòng này thực hiện nullkiểm tra nhưng như mặc định là ""nó luôn bị lỗi và đặt bối cảnh thành ""và do đó ghi đè lên của bạn).


Câu trả lời của bạn là chính xác (ý ​​tôi là, bạn có thể tùy chỉnh các thuộc tính của thùng chứa servlet bằng tệp thuộc tính ứng dụng), tại sao lại có phương thức setContextPath (đường dẫn), ý tôi là, nếu đường dẫn không được thi hành, thì nó tốt cho cái gì? BTW, tương tự với setContextPath (...) trên EmbeddedServletContainerCustomizer
Modi

2
Tôi sẽ mong đợi một từ EmbeddedServletContainerCustomizercũng làm việc. Nhưng tôi sẽ đi những gì được cung cấp thay vì cố gắng tự mình làm. Tại sao giải pháp của bạn không hoạt động phải thực hiện với hành vi mặc định được lập trình (vô tình?) Trong ServerProperties, cấu hình mặc định contextPath""(và nó sẽ kiểm tra nullvà không "". Cái sau ghi đè cài đặt rõ ràng của bạn contextPath.
M. Deinum

Các thuộc tính đã thay đổi, xem câu trả lời của tôi dưới đây.
Michael Simons

5
Tôi đoán tài sản trong Spring Boot 2.0 là "server.servlet.context-path"
IamVickyAV

34

Nếu bạn đang sử dụng Spring Boot, thì bạn không phải định cấu hình các thuộc tính máy chủ thông qua khởi tạo Vean.

Thay vào đó, nếu một chức năng có sẵn cho cấu hình cơ bản, thì nó có thể được đặt trong tệp "thuộc tính" được gọi application, sẽ nằm src\main\resourcestrong cấu trúc ứng dụng của bạn. Tệp "thuộc tính" có sẵn ở hai định dạng

  1. .yml

  2. .properties

Cách bạn chỉ định hoặc đặt cấu hình khác nhau từ định dạng này sang định dạng khác.

Trong trường hợp cụ thể của bạn, nếu bạn quyết định sử dụng phần mở rộng .properties, sau đó bạn sẽ có một tập tin gọi là application.propertiesthuộc src\main\resourcesvới các thiết lập cấu hình sau

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

OTOH, nếu bạn quyết định sử dụng .ymltiện ích mở rộng (nghĩa là application.yml), bạn sẽ cần đặt cấu hình bằng định dạng sau (nghĩa là YAML):

server:
    port: 8080
    contextPath: /context-path

Để biết các thuộc tính phổ biến hơn của Spring Boot, hãy tham khảo liên kết dưới đây:

https://docs.spring.io/spring-boot/docs/civerse/reference/html/common-application-properIES.html


22

Nếu bạn sử dụng Spring Boot 2.0.0, hãy sử dụng:

server.servlet.context-path

2
điều này không hoạt động đối với các tệp chiến tranh được triển khai trong tomcat bên ngoài
pise

1
Đối với tôi điều này không hiệu quả (Spring Boot 2.1.2), nhưng đã làm việc này:server.servlet.contextPath=/api
lospejos

2
@pise, bạn đã biết cách sửa nó cho tập tin chiến tranh trong tomcat bên ngoài chưa?
mohax

11

xin lưu ý rằng các thuộc tính "server.context-path" hoặc "server.servlet.context-path" [bắt đầu từ springboot 2.0.x] sẽ chỉ hoạt động nếu bạn đang triển khai vào một thùng chứa nhúng, ví dụ như tomcat nhúng. Các thuộc tính này sẽ không có hiệu lực nếu bạn đang triển khai ứng dụng của mình như một cuộc chiến với một con mèo con bên ngoài chẳng hạn.

xem câu trả lời này tại đây: https://stackoverflow.com/a/43856300/4449859


Có ai đã tìm ra cách cấu hình cái này khi triển khai một tomcat bên ngoài dưới dạng wartệp bằng cách sử dụng springboot v2.xtomcat v8.5chưa?
Giải pháp đơn giản

@abdel thậm chí tôi đang tìm câu trả lời, nếu chúng ta đang triển khai tệp chiến tranh trong tomcat bên ngoài thì làm thế nào để thiết lập đường dẫn ngữ cảnh.
pise

Tôi đã thử nó ra. Nó chính xác như những gì nó đã được nêu trong liên kết ở trên. Thay đổi giá trị thuộc tính build -> FinalName thành đường dẫn ngữ cảnh của bạn. Tệp chiến tranh kết quả sau đó sẽ được sử dụng đường dẫn ngữ cảnh làm tên tệp, sau đó sẽ được tomcat sử dụng để làm đường dẫn ngữ cảnh.
DriLLFreAK100

cách duy nhất tôi có thể nghĩ đến khi triển khai như chiến tranh trong tomcat bên ngoài là đảm bảo tên chiến tranh phù hợp với bối cảnh bạn đang theo đuổi. vì vậy, ví dụ, nếu bạn muốn bối cảnh là '/ xyzwebapp' thì cuộc chiến của bạn phải được đặt tên là xyzwebapp.war. để đạt được điều này, bạn có thể thêm phần sau vào phần tử <build> trong pom.xml của bạn: <FinalName> xyzwebapp </ FinalName>.
abdel

9

Các thuộc tính chính xác là

server.servlet.path

để định cấu hình đường dẫn của DispatcherServlet

server.servlet.context-path

để cấu hình đường dẫn của bối cảnh ứng dụng bên dưới đó.


Cảm ơn bạn rất nhiều
hema chandra

2

Chúng ta có thể thay đổi đường dẫn gốc ngữ cảnh bằng cách sử dụng một mục đơn giản trong tệp thuộc tính.

application.properties

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

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

1

Chúng ta có thể thiết lập nó trong application.propertiesnhư API_CONTEXT_ROOT=/therootpath

Và chúng tôi truy cập nó trong lớp Java như được đề cập dưới đây

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

1

server.contextPath = / mainstay

hoạt động với tôi nếu tôi có một tệp tin chiến tranh trong JBOSS. Trong số nhiều tệp chiến tranh, mỗi tệp chứa jboss-web.xml, nó không hoạt động. Tôi đã phải đặt jboss-web.xml trong thư mục WEB-INF có nội dung

<?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

Trong khởi động mùa xuân 1.5:

Thêm thuộc tính sau vào application.properties:

server.context-path=/demo

Lưu ý: /demolà URL đường dẫn ngữ cảnh của bạn.


1

Bạn có thể làm điều đó bằng cách dễ dàng thêm cổng và ngữ cảnh để thêm cấu hình trong tệp [src \ main \ resource] .properations và cả tệp .yml

cấu hình tập tin application.porperies

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

cấu hình tập tin application.yml

server:
port: 8084
contextPath: /context-path

Chúng ta cũng có thể thay đổi nó theo chương trình trong khởi động mùa xuân.

@Component
public class ServerPortCustomizer implements     WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {

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

}

Chúng tôi cũng có thể thêm một cách khác

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

sử dụng lệnh java boot mùa xuân 1.X

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

sử dụng lệnh java boot mùa xuân 2.X

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

chúng ta cũng có thể thêm cổng máy chủ theo chương trình
Ghulam Murtaza

0

Nếu bạn đang sử dụng application.yml và phiên bản mùa xuân trên 2.0 thì hãy cấu hình theo cách bên dưới.

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

Bây giờ tất cả các cuộc gọi api sẽ giống như http: // localhost: 8081 / demo-api /


0

Chúng ta có thể thiết lập nó bằng cách sử dụng WebServerFactoryCustomizer. Điều này có thể được thêm trực tiếp vào lớp phương thức khởi động chính mùa xuân khởi động Spring ApplicationContext.

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

0

Nếu bạn sử dụng Spring Boot 2.x và muốn chuyển thuộc tính đường dẫn ngữ cảnh trong dòng lệnh, bạn nên đặt double // như thế này:

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

Điều đó làm việc cho tôi chạy trong cửa sổ.


0
<!-- Server port-->

server.port=8080

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

server.servlet.context-path=/ems

Cổng máy chủ sẽ là 8080. nếu bạn muốn bất kỳ cổng nào khác, bạn có thể thay thế 8080. Đường dẫn ngữ cảnh ứng dụng Fro tôi đã đặt. Bạn có thể đặt đường dẫn khác theo yêu cầu của mình
Bordoloi Parth

1
Đó là thông tin hữu ích, tại sao bạn không thêm nó vào câu trả lời của mình thay vì bình luận?
k-den

0

Nó phải là: server.servlet.context-path = / demo lưu ý rằng nó không có dấu ngoặc kép chỉ có giá trị đứng trước '/' giá trị này nằm trong tệp application.properies của bạn


-1

đường dẫn ngữ cảnh có thể được tích hợp trực tiếp vào mã nhưng không nên sử dụng vì không thể sử dụng lại vì vậy hãy ghi vào tệp application.properations server.contextPath = / name của thư mục nơi bạn đặt mã contextPath = tên của thư mục nơi bạn đặt mã / Lưu ý: xem dấu gạch chéo cẩn thận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.