Tambahkan path konteks ke aplikasi Spring Boot


174

Saya mencoba untuk mengatur konteks aplikasi Boot Spring secara terprogram. Alasan untuk konteks root adalah kami ingin aplikasi diakses localhost:port/{app_name}dan semua path controller ditambahkan ke sana.

Ini adalah file konfigurasi aplikasi untuk aplikasi 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;
  }
}

Berikut adalah pengontrol indeks untuk halaman utama.

@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 aplikasi baru harus di localhost:12378/mainstay, tetapi masih terletak di localhost:12378.

Apa yang saya lewatkan yang menyebabkan Spring Boot tidak menambahkan root konteks sebelum pemetaan permintaan?

Jawaban:


382

Mengapa Anda mencoba menggulung solusi Anda sendiri. Spring-boot sudah mendukung itu.

Jika Anda belum memilikinya, tambahkan application.propertiesfile ke src\main\resources. Dalam file properti itu, tambahkan 2 properti:

server.contextPath=/mainstay
server.port=12378

UPDATE (Spring Boot 2.0)

Pada Spring Boot 2.0 (karena dukungan dari Spring MVC dan Spring WebFlux), contextPathtelah diubah sebagai berikut:

server.servlet.contextPath=/mainstay

Anda kemudian dapat menghapus konfigurasi Anda untuk wadah servlet khusus. Jika Anda perlu melakukan beberapa pemrosesan pos pada wadah Anda dapat menambahkan EmbeddedServletContainerCustomizerimplementasi ke konfigurasi Anda (misalnya untuk menambahkan halaman kesalahan).

Pada dasarnya properti di dalam application.propertiespenyajian sebagai default Anda selalu dapat menimpanya dengan menggunakan yang lain di application.propertiessamping artefak yang Anda berikan atau dengan menambahkan parameter JVM ( -Dserver.port=6666).

Lihat juga Panduan Referensi terutama bagian properti .

Kelas ServerPropertiesmengimplementasikan EmbeddedServletContainerCustomizer. Default untuk contextPathadalah "". Dalam contoh kode Anda, Anda mengatur contextPathlangsung di TomcatEmbeddedServletContainerFactory. Selanjutnya ServerPropertiesinstance akan memproses instance ini dan mengatur ulang dari jalur Anda ke "". ( Baris ini melakukan nullpemeriksaan tetapi sebagai default ""selalu gagal dan mengatur konteks untuk ""dan dengan demikian menimpa Anda).


Meskipun jawaban Anda benar (maksud saya, Anda dapat mengkustomisasi properti servlet container dengan file properti aplikasi), mengapa ada metode setContextPath (path), maksud saya, jika jalur tidak ditegakkan, apa gunanya? BTW, hal yang sama berlaku untuk setContextPath (...) pada EmbeddedServletContainerCustomizer
Modi

2
Saya akan mengharapkan yang dari EmbeddedServletContainerCustomizerjuga bekerja. Tapi aku akan pergi apa yang disediakan bukannya mencoba sendiri. Mengapa solusi Anda tidak bekerja berkaitan dengan perilaku default yang diprogram (secara tidak sengaja?) Di ServerProperties, konfigurasi default contextPathadalah ""(dan memeriksa nulldan tidak "". Yang terakhir menimpa Anda secara eksplisit ditetapkan contextPath.
M. Deinum

Properti telah berubah, lihat jawaban saya di bawah ini.
Michael Simons

5
Saya kira properti di Spring Boot 2.0 adalah "server.servlet.context-path"
IamVickyAV

34

Jika Anda menggunakan Spring Boot, maka Anda tidak perlu mengkonfigurasi properti server melalui inisialisasi Vean.

Sebaliknya, jika satu fungsionalitas tersedia untuk konfigurasi dasar, maka dapat diatur dalam file "properties" yang dipanggil application, yang seharusnya berada src\main\resourcesdi bawah dalam struktur aplikasi Anda. File "properties" tersedia dalam dua format

  1. .yml

  2. .properties

Cara Anda menentukan atau mengatur konfigurasi berbeda dari satu format ke format lainnya.

Dalam kasus tertentu, jika Anda memutuskan untuk menggunakan ekstensi .properties, maka Anda akan memiliki sebuah file yang bernama application.propertiesbawah src\main\resourcesdengan pengaturan konfigurasi berikut

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

OTOH, jika Anda memutuskan untuk menggunakan .ymlekstensi (yaitu application.yml), Anda perlu mengatur konfigurasi menggunakan format berikut (yaitu YAML):

server:
    port: 8080
    contextPath: /context-path

Untuk properti Spring Boot yang lebih umum lihat tautan di bawah ini:

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


22

Jika Anda menggunakan Spring Boot 2.0.0 gunakan:

server.servlet.context-path

2
ini tidak berfungsi untuk file perang yang digunakan di kucing jantan eksternal
pise

1
Bagi saya ini tidak berhasil (Spring Boot 2.1.2), tetapi berhasil ini:server.servlet.contextPath=/api
lospejos

2
@pise, apakah Anda tahu cara memperbaikinya untuk file perang di kucing jantan eksternal?
mohax

11

harap perhatikan bahwa properti "server.context-path" atau "server.servlet.context-path" [mulai dari springboot 2.0.x] hanya akan berfungsi jika Anda menggunakan wadah yang disematkan, misalnya tomcat yang disematkan. Properti ini tidak akan berpengaruh jika Anda menggunakan aplikasi Anda sebagai perang ke kucing jantan eksternal misalnya.

lihat jawaban ini di sini: https://stackoverflow.com/a/43856300/4449859


Adakah yang tahu cara mengkonfigurasi ini ketika menggunakan tomcat eksternal sebagai warfile yang menggunakan springboot v2.xdan tomcat v8.5?
Solusi Sederhana

@abdel bahkan saya mencari jawabannya, bagaimana jika kita mengerahkan file perang di tomcat eksternal cara mengatur path konteks.
pise

Saya sudah mencobanya. Persis seperti apa yang dinyatakan dalam tautan di atas. Ubah nilai atribut build -> finalName ke jalur konteks Anda. File perang yang dihasilkan kemudian akan menggunakan path konteks sebagai nama file, yang kemudian akan digunakan oleh kucing jantan untuk berfungsi sebagai path konteks.
DriLLFreAK100

satu-satunya cara saya bisa memikirkan untuk menyebarkan sebagai perang di kucing jantan eksternal adalah untuk memastikan nama perang sesuai dengan konteks yang Anda cari. jadi misalnya, jika Anda ingin konteksnya menjadi '/ xyzwebapp' maka perang Anda harus dinamai xyzwebapp.war. untuk mencapai ini, Anda dapat menambahkan berikut ini ke elemen <build> di pom.xml Anda: <finalName> xyzwebapp </finalName>.
abdel

9

Properti yang benar adalah

server.servlet.path

untuk mengkonfigurasi jalur DispatcherServlet

dan

server.servlet.context-path

untuk mengkonfigurasi jalur konteks aplikasi di bawah itu.


Terima kasih banyak
hema chandra

2

Kita dapat mengubah path root konteks menggunakan entri sederhana di file properti.

application.properties

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

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

1

Kita bisa mengaturnya di application.propertiesas API_CONTEXT_ROOT=/therootpath

Dan kami mengaksesnya di kelas Java seperti yang disebutkan di bawah ini

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

1

server.contextPath = / andalan

berfungsi untuk saya jika saya punya satu file perang di JBOSS. Di antara banyak file perang tempat masing-masing berisi jboss-web.xml tidak berfungsi. Saya harus meletakkan jboss-web.xml di dalam direktori WEB-INF dengan konten

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

Di Spring Boot 1.5:

Tambahkan properti berikut di application.properties:

server.context-path=/demo

Catatan: /demoadalah URL jalur konteks Anda.


1

Anda dapat melakukannya dengan menambahkan port dan path konteks dengan mudah untuk menambahkan konfigurasi di [src \ main \ resources] file .properties dan juga file .yml

konfigurasi file application.porperties

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

konfigurasi file application.yml

server:
port: 8084
contextPath: /context-path

Kita juga bisa mengubahnya secara program di spring boot.

@Component
public class ServerPortCustomizer implements     WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {

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

}

Kami juga bisa menambahkan cara lain

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

menggunakan perintah java spring boot 1.X

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

menggunakan perintah java spring boot 2.X

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

kami juga dapat menambahkan port server secara terprogram
Ghulam Murtaza


0

Kita bisa mengaturnya menggunakan WebServerFactoryCustomizer. Ini dapat ditambahkan secara langsung di kelas metode boot utama spring yang memulai Spring ApplicationContext.

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

0

Jika Anda menggunakan Spring Boot 2.x dan ingin meneruskan properti path konteks di baris perintah, Anda harus meletakkan double // seperti ini:

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

Itu berhasil bagi saya berjalan di windows.


0
<!-- Server port-->

server.port=8080

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

server.servlet.context-path=/ems

Port server akan menjadi 8080. jika Anda menginginkan port lain, Anda dapat mengganti 8080. Jalur konteks aplikasi mondar-mandir saya telah menetapkan ems. Anda dapat mengatur jalur lain sesuai kebutuhan Anda
Bordoloi Parth

1
Itu informasi yang berguna, mengapa Anda tidak menambahkannya ke dalam jawaban Anda alih-alih komentar?
k-den

0

Itu harus: server.servlet.context-path = / catatan demo yang tidak memiliki tanda kutip hanya nilai yang diawali oleh '/' nilai ini masuk dalam file application.properties Anda


-1

path konteks dapat langsung diintegrasikan ke kode tetapi tidak disarankan karena tidak dapat digunakan kembali jadi tulis di file application.properties server.contextPath = / nama folder tempat Anda meletakkan kode contextPath = nama folder tempat Anda meletakkan kode / Catatan: perhatikan pemotongan dengan hati-hati.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.