स्प्रिंग बूट एप्लिकेशन में संदर्भ पथ जोड़ें


174

मैं एक स्प्रिंग बूट एप्लिकेशन संदर्भ रूट को प्रोग्रामेटिक रूप से सेट करने का प्रयास कर रहा हूं। संदर्भ रूट का कारण यह है कि हम चाहते हैं कि ऐप को एक्सेस किया जाए 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/mainstay, लेकिन यह अभी भी स्थित है localhost:12378

मुझे वह क्या याद आ रहा है जो स्प्रिंग बूट के कारण अनुरोध मानचित्रण से पहले संदर्भ रूट को नहीं जोड़ रहा है?

जवाबों:


382

आप अपने स्वयं के समाधान को रोल करने की कोशिश क्यों कर रहे हैं। स्प्रिंग-बूट पहले से ही इसका समर्थन करता है।

यदि आपके पास पहले से कोई नहीं है, तो एक application.propertiesफ़ाइल जोड़ें src\main\resources। उस गुण फ़ाइल में, 2 गुण जोड़ें:

server.contextPath=/mainstay
server.port=12378

अद्यतन (स्प्रिंग बूट 2.0)

स्प्रिंग बूट 2.0 (स्प्रिंग एमवीसी और स्प्रिंग वेबफ़्लक्स दोनों के समर्थन के कारण) contextPathको निम्न में बदल दिया गया है:

server.servlet.contextPath=/mainstay

फिर आप कस्टम सर्वलेट कंटेनर के लिए अपना कॉन्फ़िगरेशन हटा सकते हैं। यदि आपको कंटेनर पर कुछ पोस्ट प्रोसेसिंग करने की आवश्यकता है तो आप EmbeddedServletContainerCustomizerअपने कॉन्फ़िगरेशन में एक कार्यान्वयन जोड़ सकते हैं (उदाहरण के लिए त्रुटि पृष्ठों को जोड़ने के लिए)।

मूल application.propertiesरूप से एक डिफ़ॉल्ट के रूप में सेवा के अंदर गुण आप हमेशा उनके द्वारा application.propertiesवितरित की गई कलाकृतियों के बगल में या जेवीएम मापदंडों ( -Dserver.port=6666) को जोड़कर उन्हें ओवरराइड कर सकते हैं ।

संदर्भ अनुभाग विशेष रूप से गुण अनुभाग भी देखें ।

वर्ग ServerPropertiesलागू करता है EmbeddedServletContainerCustomizer। के लिए डिफ़ॉल्ट contextPathहै ""। अपने कोड नमूने में आप contextPathसीधे पर सेट कर रहे हैं TomcatEmbeddedServletContainerFactory। अगला ServerPropertiesउदाहरण इस उदाहरण को संसाधित करेगा और इसे आपके पथ से रीसेट करेगा ""। ( यह रेखा एक nullजांच करती है लेकिन डिफ़ॉल्ट के रूप में ""यह हमेशा विफल रहता है और इस संदर्भ को सेट करता है ""और इस प्रकार आपका ओवरराइड करता है)।


आपका उत्तर सही है (मेरा मतलब है, आप अनुप्रयोग गुण फ़ाइल द्वारा सर्वलेट कंटेनर गुणों को अनुकूलित कर सकते हैं), सेटकोटेक्स्टपथ (पथ) विधि क्यों है, मेरा मतलब है, यदि पथ लागू नहीं किया गया है, तो इसके लिए क्या अच्छा है? बीटीडब्लू, एंबेडेड सर्वाइलेटकंटेनर कस्टूमाइज़र पर सेटकोटेक्स्टपाथ (...) के लिए चला जाता है
मोदी

2
मैं एक से EmbeddedServletContainerCustomizerभी काम करने की उम्मीद करूंगा । लेकिन मैं जाता हूं कि आपको खुद से बोल्ट लगाने की कोशिश करने के बजाय क्या प्रदान किया जाता है। आपके समाधान से काम क्यों नहीं चलता है (गलती से?) डिफ़ॉल्ट डिफ़ॉल्ट प्रोग्राम के साथ करना पड़ता है ServerProperties, डिफ़ॉल्ट कॉन्फ़िगर किया गया contextPathहै ""(और यह जाँच करता है nullऔर नहीं ""। उत्तरार्द्ध आपके स्पष्ट रूप से सेट को ओवरराइड करता है contextPath
एम। डिइनम

गुण बदल गए हैं, नीचे मेरा जवाब देखें।
माइकल सिमंस

5
मुझे लगता है कि स्प्रिंग बूट 2.0 में संपत्ति "
server.servlet.context

34

यदि आप स्प्रिंग बूट का उपयोग कर रहे हैं, तो आपको वीएन इनिशियलाइज़िंग के माध्यम से सर्वर गुणों को कॉन्फ़िगर करने की आवश्यकता नहीं है।

इसके बजाय, यदि एक कार्यक्षमता बुनियादी कॉन्फ़िगरेशन के लिए उपलब्ध है, तो इसे "गुण" फ़ाइल में सेट किया जा सकता है 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

स्प्रिंग बूट के अधिक सामान्य गुणों के लिए नीचे दिए गए लिंक को देखें:

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


22

यदि आप स्प्रिंग बूट 2.0.0 का उपयोग करते हैं:

server.servlet.context-path

2
यह बाहरी
टॉमकैट

1
मेरे लिए यह काम नहीं किया (स्प्रिंग बूट 2.1.2), लेकिन यह काम किया:server.servlet.contextPath=/api
lospejos

2
@pise, क्या आप जानते हैं कि बाहरी टोमैट में युद्ध फ़ाइल के लिए इसे कैसे ठीक किया जाए?
मोहरा

11

कृपया ध्यान दें कि "server.context-path" या "server.servlet.context-path" [स्प्रिंगबूट 2.0.x से शुरू] गुण केवल तभी काम करेंगे जब आप एक एम्बेडेड कंटेनर जैसे, एम्बेडेड टोमैट को तैनात कर रहे हों। इन गुणों का कोई प्रभाव नहीं होगा यदि आप अपने आवेदन को युद्ध के लिए एक बाहरी टामकैट के रूप में तैनात कर रहे हैं।

इस उत्तर को यहां देखें: https://stackoverflow.com/a/43856300/4449859


क्या किसी ने यह पता लगाया है कि बाहरी टॉमकट को warफाइल के रूप में उपयोग करते समय springboot v2.xऔर इसे कैसे कॉन्फ़िगर किया जाए tomcat v8.5?
सरल-समाधान

@abdel यहां तक ​​कि मुझे जवाब की तलाश है, क्या होगा यदि हम बाहरी टोमकैट में युद्ध फ़ाइल को तैनात कर रहे हैं कि संदर्भ पथ कैसे सेट किया जाए।
मिट्टी से बना हुआ

मैं इसे आज़मा रहा था। यह बिल्कुल वैसा ही है जैसा ऊपर दिए गए लिंक में बताया गया था। अपने संदर्भ पथ में बिल्ड -> अंतिम नाम विशेषता मान बदलें। परिणामी युद्ध फ़ाइल को तब फ़ाइल नाम के रूप में संदर्भ पथ का उपयोग किया जाएगा, जो तब संदर्भ पथ के रूप में सेवा करने के लिए टॉमकैट द्वारा उपयोग किया जाएगा।
DriLLFreAK100

जिस तरह से मैं बाहरी टोमसैट में युद्ध को तैनात करने के लिए सोच सकता हूं, वह यह है कि युद्ध के नाम का संदर्भ उस संदर्भ से सुनिश्चित किया जाए जो आप बाद में हैं। उदाहरण के लिए, यदि आप चाहते हैं कि संदर्भ '/ xyzwebapp' हो तो आपके युद्ध का नाम xyzwebapp.war होना चाहिए। इसे प्राप्त करने के लिए, आप अपने pom.xml में निम्न <build> तत्व जोड़ सकते हैं: <फाइनलनाम> xyzwebapp </ फाइनल नाम>।
पेट

9

सही गुण हैं

server.servlet.path

DispatcherServlet के पथ को कॉन्फ़िगर करने के लिए

तथा

server.servlet.context-path

नीचे दिए गए अनुप्रयोगों के संदर्भ के पथ को कॉन्फ़िगर करने के लिए।


बहुत बहुत धन्यवाद
हेमा चंद्रा

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

और हम इसे नीचे वर्णित के रूप में जावा वर्ग में एक्सेस करते हैं

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

1

server.contextPath = / मुख्य आधार

मेरे लिए काम करता है अगर मेरे पास JBOSS में एक युद्ध फ़ाइल थी। कई युद्ध फाइलों में जहां प्रत्येक में jboss-web.xml होता है, यह काम नहीं करता था। मुझे कंटेंट के साथ WEB-INF डायरेक्टरी के अंदर jboss-web.xml डालना था

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

वसंत बूट में 1.5:

निम्नलिखित संपत्ति जोड़ें application.properties:

server.context-path=/demo

नोट: /demoआपका संदर्भ पथ URL है।


1

आप इसे [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);
    }       
}

जावा कमांड स्प्रिंग बूट 1.X का उपयोग करना

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

जावा कमांड स्प्रिंग बूट 2.X का उपयोग करना

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

हम प्रोग्राम पोर्ट को भी जोड़ सकते हैं
गुलाम मुर्तजा

0

यदि आप 2.0 से ऊपर application.yml और स्प्रिंग संस्करण का उपयोग कर रहे हैं तो नीचे दिए गए तरीके से कॉन्फ़िगर करें।

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

अब सभी एप कॉल http: // localhost: 8081 / डेमो-एपीआई / जैसे होंगे।


0

हम इसका उपयोग करके सेट कर सकते हैं WebServerFactoryCustomizer। इसे सीधे स्प्रिंग बूट मेन मेथड क्लास में जोड़ा जा सकता है जो स्प्रिंग एप्लीकेशन कॉन्टेक्स्ट शुरू करता है।

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

0

यदि आप स्प्रिंग बूट 2.x का उपयोग करते हैं और कमांड लाइन में संदर्भ पथ संपत्ति को पास करना चाहते हैं, तो आपको इस तरह से डबल // लगाना चाहिए:

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

यह मेरे लिए खिड़कियों में काम कर रहा है।


0
<!-- Server port-->

server.port=8080

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

server.servlet.context-path=/ems

सर्वर पोर्ट 8080 होगा। यदि आप कोई अन्य पोर्ट चाहते हैं, तो आप 8080 को बदल सकते हैं। फ़्रॉ एप्लिकेशन संदर्भ पथ मैंने ईएमएस सेट किया है। आप अपनी आवश्यकता के अनुसार अन्य मार्ग निर्धारित कर सकते हैं
बोर्डोली पार्थ

1
यह उपयोगी जानकारी है, आप इसे टिप्पणी के बजाय अपने उत्तर में क्यों नहीं जोड़ते?
k-den

0

यह होना चाहिए: server.servlet.context-path = / डेमो नोट में यह उद्धरण नहीं है कि केवल '/' द्वारा पूर्ववर्ती मूल्य है, यह मान आपके एप्लिकेशन में चला जाता है।


-1

संदर्भ पथ कोड के साथ सीधे एकीकृत किया जा सकता है, लेकिन यह उचित नहीं है क्योंकि इसका पुन: उपयोग नहीं किया जा सकता है इसलिए अनुप्रयोग में लिखें। फ़ाइल फ़ाइल सर्वर .contextPath = / उस फ़ोल्डर का नाम जहां आपने कोड संदर्भ रखा = फ़ोल्डर का नाम जहां आपने रखा था कोड / नोट: स्लैश को ध्यान से देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.