Spring Boot uygulamasına bağlam yolu ekleme


174

Programlı bir Spring Boot uygulamaları bağlam kökü ayarlamaya çalışıyorum. Bağlam kökünün nedeni, uygulamanın erişilebilir olmasını localhost:port/{app_name}ve tüm denetleyici yollarının eklenmesini istememizdir .

İşte web uygulaması için uygulama yapılandırma dosyası.

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

İşte ana sayfanın dizin denetleyicisi.

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

}

Uygulamanın yeni kökü olmalıdır localhost:12378/mainstay, ancak yine de adresinde bulunur localhost:12378.

Spring Boot'un istek eşlemesinden önce bağlam kökünü eklememesine neden olan neyi kaçırıyorum?

Yanıtlar:


382

Neden kendi çözümünüzü devirmeye çalışıyorsunuz? Spring-boot bunu zaten destekliyor.

Zaten bir application.propertiesdosyanız yoksa bir dosya ekleyin src\main\resources. Bu özellikler dosyasına 2 özellik ekleyin:

server.contextPath=/mainstay
server.port=12378

GÜNCELLEME (Spring Boot 2.0)

Spring Boot 2.0'dan itibaren (hem Spring MVC hem de Spring WebFlux'ün desteği nedeniyle) contextPathaşağıdaki şekilde değiştirilmiştir:

server.servlet.contextPath=/mainstay

Ardından, özel sunucu uygulaması kapsayıcısı için yapılandırmanızı kaldırabilirsiniz. Kapsayıcıda biraz işlem yapmanız gerekirse, EmbeddedServletContainerCustomizeryapılandırmanıza bir uygulama ekleyebilirsiniz (örneğin hata sayfalarını eklemek için).

Temel olarak, application.propertieshizmetin içindeki özellikler varsayılan application.propertiesolarak, sunduğunuz eserin yanındaki başka bir öğeyi kullanarak veya JVM parametreleri ( -Dserver.port=6666) ekleyerek bunları geçersiz kılabilirsiniz .

Ayrıca bkz Referans Kılavuzu özellikle özellikler bölümüne.

Sınıf ServerPropertiesuygular EmbeddedServletContainerCustomizer. İçin varsayılan contextPathDİR "". Kod örneğinizde contextPathdoğrudan TomcatEmbeddedServletContainerFactory. Daha sonra ServerPropertiesörnek bu örneği işleyecek ve yolunuzdan sıfırlayacaktır "". ( Bu satır bir nullkontrol yapar, ancak varsayılan olarak ""her zaman başarısız olur ve bağlamı ""sizin ayarınıza göre geçersiz kılar).


Cevabınız doğru olsa da (yani, uygulama özellikleri dosyasıyla sunucu uygulaması kapsayıcı özelliklerini özelleştirebilirsiniz), neden bir setContextPath (yol) yöntemi var, yani, yol uygulanmıyorsa, bunun için ne işe yarar? BTW, EmbeddedServletContainerCustomizer'da bulunan setContextPath (...) için de geçerli
Modi

2
Birinin EmbeddedServletContainerCustomizerde çalışmasını beklerdim . Ama kendi başına civatalamak yerine verilenlere giderdim. Çözümünüz işi (yanlışlıkla?) Programlanmış varsayılan davranışı ile ilgisi var değil Neden ServerProperties, yapılandırılan varsayılan contextPatholduğu ""(ve bunun için çek nulldeğil "". İkincisi geçersiz kılma sizin açık bir şekilde ayarlanabilircontextPath .
M. Deinum

Özellikler değişti, aşağıdaki cevabımı görün.
Michael Simons

5
Sanırım Bahar Boot 2.0 özelliği "server.servlet.context yolu" dır
IamVickyAV

34

Spring Boot kullanıyorsanız, Vean başlatma yoluyla sunucu özelliklerini yapılandırmanız gerekmez.

Bunun yerine, temel yapılandırma için bir işlev varsa, o zaman "özellikler" dosyasında ayarlanabilir. applicationsrc\main\resources uygulama yapınızda yer alması gereken . "Özellikler" dosyası iki biçimde mevcuttur

  1. .yml

  2. .properties

Yapılandırmaları belirtme veya ayarlama şekli bir biçimden diğerine farklılık gösterir.

Özel durumunuzda, uzantıyı kullanmaya karar verirseniz , aşağıdaki yapılandırma ayarlarıyla altında .propertiesadlandırılan bir dosyanız olur.application.propertiessrc\main\resources

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

OTOH, .ymluzantıyı (yani application.yml) kullanmaya karar verirseniz , yapılandırmaları aşağıdaki biçimi (yani YAML) kullanarak ayarlamanız gerekir :

server:
    port: 8080
    contextPath: /context-path

Spring Boot'un daha yaygın özellikleri için aşağıdaki bağlantıya bakın:

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


22

Spring Boot 2.0.0 kullanıyorsanız şunları kullanın:

server.servlet.context-path

2
bu, harici tomcat'te dağıtılan savaş dosyaları için işe yaramıyor
pise

1
Benim için bu işe yaramadı (Spring Boot 2.1.2), ama işe yaradı:server.servlet.contextPath=/api
lospejos

2
@pise, harici tomcat'teki savaş dosyası için nasıl düzeltileceğini biliyor muydunuz?
mohax

11

"server.context-path" veya "server.servlet.context-path" [springboot 2.0.x] 'den başlayarak, özelliklerin yalnızca gömülü bir kaba, örneğin gömülü tomcat'e dağıtıldığında çalışacağını unutmayın. Örneğin, uygulamanızı harici bir tomcat'e savaş olarak dağıtıyorsanız bu özelliklerin hiçbir etkisi olmayacaktır.

bu cevaba buradan bakın: https://stackoverflow.com/a/43856300/4449859


Herkes gibi harici tomcat dağıtırken bu nasıl yapılandırılacağı anladım Has warkullanarak dosyaya springboot v2.xve tomcat v8.5?
Simple-Solution

@abdel bile cevabı arıyorum, ya da savaş dosyasını harici tomcat'e nasıl yerleştirirsek, bağlam yolunu nasıl ayarlayacağız.
pise

Deniyordum. Yukarıdaki bağlantıda belirtildiği gibi. Build -> finalName öznitelik değerini bağlam yolunuza değiştirin. Sonuçta ortaya çıkan savaş dosyası daha sonra bağlam yolunu dosya adı olarak kullanacaktır; bu dosya daha sonra tomcat tarafından bağlam yolu olarak kullanılacaktır.
DriLLFreAK100

Dış tomcat'te savaş olarak konuşlandırmayı düşünebileceğim tek yol, savaş adının peşinde olduğunuz bağlamla eşleştiğinden emin olmaktır. örneğin, bağlamın '/ xyzwebapp' olmasını istiyorsanız, savaşınızın xyzwebapp.war olarak adlandırılması gerekir. bunu başarmak için pom.xml dosyanızdaki <build> öğesine aşağıdakileri ekleyebilirsiniz: <finalName> xyzwebapp </finalName>.
abdel

9

Doğru özellikler

server.servlet.path

DispatcherServlet yolunu yapılandırmak için

ve

server.servlet.context-path

bunun altındaki uygulamalar bağlamının yolunu yapılandırmak için.


Çok teşekkür ederim
hema chandra

2

Özellikler kökündeki basit bir girişi kullanarak bağlam kök yolunu değiştirebiliriz.

application.properties

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

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

1

Biz bunu ayarlayabilirsiniz application.propertiesolarak API_CONTEXT_ROOT=/therootpath

Ve Java sınıfında aşağıda belirtildiği gibi erişiyoruz

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

1

server.contextPath = / dayanak

JBOSS'ta bir savaş dosyası olsaydı benim için çalışıyor. Her birinin jboss-web.xml içerdiği birden fazla savaş dosyası arasında işe yaramadı. İçeriği ile WEB-INF dizini içine jboss-web.xml koymak zorunda kaldı

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

Bahar çizme 1.5:

Aşağıdaki özelliği ekleyin application.properties:

server.context-path=/demo

Not: /demoiçerik yolu URL'nizdir.


1

Yapılandırmayı [src \ main \ resources] .properties dosyasında ve ayrıca .yml dosyasına eklemek için bağlantı noktasını ve bağlam yolunu kolayca ekleyerek yapabilirsiniz.

application.porperties dosya yapılandırması

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

application.yml dosya yapılandırması

server:
port: 8084
contextPath: /context-path

Ayrıca bahar önyüklemesinde programlı olarak değiştirebiliriz.

@Component
public class ServerPortCustomizer implements     WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {

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

}

Başka bir yol da ekleyebiliriz

@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 komut yay önyükleme 1.X kullanarak

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

Java komutu yaylı önyükleme 2.X kullanarak

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

Ayrıca sunucu portunu programlı olarak ekleyebiliriz
Ghulam Murtaza


0

Bunu kullanarak ayarlayabiliriz WebServerFactoryCustomizer. Bu, doğrudan Spring ApplicationContext'i başlatan spring boot ana yöntem sınıfına eklenebilir.

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

0

Spring Boot 2.x kullanıyorsanız ve komut satırına bağlam yolu özelliğini iletmek istiyorsanız, double // komutunu şu şekilde koymalısınız:

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

Pencerelerde koşmak benim için çalıştı.


0
<!-- Server port-->

server.port=8080

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

server.servlet.context-path=/ems

Sunucu bağlantı noktası 8080 olacaktır. Başka bir bağlantı noktası istiyorsanız, 8080'i değiştirebilirsiniz. Fro uygulama bağlamı yolu ems ayarladım. İhtiyacınıza göre başka bir yol ayarlayabilirsiniz
Bordoloi Parth

1
Bu yararlı bilgi, neden bir yorum yerine cevabınıza eklemiyorsunuz?
k-den

0

Şu şekilde olmalıdır: server.servlet.context-path = / demo, yalnızca '/' ile başlayan değerin tırnak işaretleri olmadığına dikkat edin. Bu değer application.properties dosyanıza gider


-1

bağlam yolu doğrudan koda entegre edilebilir, ancak yeniden kullanılamayacağı için önerilmez, bu yüzden application.properties dosyasında yazın. server.contextPath = / kodu yerleştirdiğiniz klasörün adı contextPath = yerleştirdiğiniz klasörün adı kod / Not: eğik çizgiyi dikkatlice izleyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.