Próbuję programowo ustawić kontekstowy katalog główny aplikacji Spring Boot. Powodem istnienia kontekstowego katalogu głównego jest to, że chcemy, aby aplikacja była dostępna localhost:port/{app_name}
i wszystkie ścieżki kontrolera były do niej dołączone.
Oto plik konfiguracyjny aplikacji internetowej.
@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;
}
}
Oto kontroler indeksu dla strony głównej.
@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";
}
}
Nowy katalog główny aplikacji powinien znajdować się pod adresem localhost:12378/mainstay
, ale nadal znajduje się pod adresem localhost:12378
.
Czego mi brakuje, co powoduje, że Spring Boot nie dołącza kontekstowego katalogu głównego przed mapowaniem żądania?
źródło
EmbeddedServletContainerCustomizer
też zadziała. Ale poszedłbym, co jest przewidziane, zamiast próbować się spieszyć. Dlaczego twoje rozwiązanie nie działa, ma związek z domyślnym zachowaniem zaprogramowanym (przypadkowo?) WServerProperties
, domyślna konfiguracjacontextPath
to""
(i sprawdza,null
czy nie""
. To drugie zastępuje twoje jawnie ustawione)contextPath
.Jeśli używasz Spring Boot, nie musisz konfigurować właściwości serwera poprzez inicjalizację Vean.
Zamiast tego, jeśli jedna funkcjonalność jest dostępna dla podstawowej konfiguracji, można ją ustawić w pliku „właściwości” o nazwie
application
, który powinien znajdować sięsrc\main\resources
w strukturze aplikacji. Plik „właściwości” jest dostępny w dwóch formatach.yml
.properties
Sposób określania lub ustawiania konfiguracji różni się w zależności od formatu.
W twoim konkretnym przypadku, jeśli zdecydujesz się użyć rozszerzenia
.properties
, będziesz miał plik o nazwieapplication.properties
undersrc\main\resources
z następującymi ustawieniami konfiguracjiOTOH, jeśli zdecydujesz się na użycie
.yml
rozszerzenia (tj.application.yml
), Musisz ustawić konfiguracje w następującym formacie (tj.YAML
):Aby uzyskać więcej typowych właściwości Spring Boot, skorzystaj z poniższego łącza:
źródło
Jeśli używasz Spring Boot 2.0.0, użyj:
źródło
server.servlet.contextPath=/api
pamiętaj, że właściwości "server.context-path" lub "server.servlet.context-path" [począwszy od springboot 2.0.x] będą działać tylko wtedy, gdy wdrażasz do kontenera osadzonego, np. embedded tomcat. Te właściwości nie przyniosą efektu, jeśli na przykład wdrażasz aplikację jako wojnę na zewnętrznym urządzeniu Tomcat.
zobacz tę odpowiedź tutaj: https://stackoverflow.com/a/43856300/4449859
źródło
war
plik przy użyciuspringboot v2.x
itomcat v8.5
?Prawidłowe właściwości to
aby skonfigurować ścieżkę do DispatcherServlet
i
aby skonfigurować ścieżkę kontekstu aplikacji poniżej.
źródło
Możemy zmienić kontekstową ścieżkę główną za pomocą prostego wpisu w pliku właściwości.
application.properties
źródło
Możemy to ustawić w
application.properties
asAPI_CONTEXT_ROOT=/therootpath
Dostęp do niego uzyskujemy w klasie Java, jak wspomniano poniżej
źródło
server.contextPath = / mainstay
działa dla mnie, gdybym miał jeden plik wojenny w JBOSS. Wśród wielu plików wojennych, z których każdy zawierał jboss-web.xml, nie działał. Musiałem umieścić jboss-web.xml w katalogu WEB-INF z zawartością
źródło
In Spring Boot 1.5:
Dodaj następującą właściwość w
application.properties
:Uwaga:
/demo
to adres URL ścieżki kontekstowej.źródło
Możesz to zrobić, dodając port i ścieżkę kontekstu, aby dodać konfigurację w pliku [src \ main \ resources] .properties, a także w pliku .yml
Konfiguracja pliku application.porperties
Konfiguracja pliku application.yml
Możemy to również zmienić programowo podczas rozruchu wiosennego.
}
Możemy też dodać inny sposób
używając java command spring boot 1.X
używając java command spring boot 2.X
źródło
Jeśli używasz application.yml i wersji Spring powyżej 2.0, skonfiguruj w poniższy sposób.
Teraz całe wywołanie api będzie wyglądać następująco : http: // localhost: 8081 / demo-api /
źródło
Możemy to ustawić za pomocą
WebServerFactoryCustomizer
. Można to dodać bezpośrednio w głównej klasie metody rozruchu sprężyny, która uruchamia Spring ApplicationContext.źródło
Jeśli używasz Spring Boot 2.x i chcesz przekazać właściwość ścieżki kontekstu w wierszu poleceń, powinieneś umieścić podwójne // w ten sposób:
To zadziałało w przypadku mnie w oknach.
źródło
źródło
Musi to być: server.servlet.context-path = / demo uwaga, że nie ma cudzysłowów, tylko wartość poprzedzona znakiem „/” ta wartość jest umieszczana w pliku application.properties
źródło
ścieżka kontekstu może być bezpośrednio zintegrowana z kodem, ale nie jest to zalecane, ponieważ nie można jej ponownie użyć, więc napisz w pliku application.properties server.contextPath = / nazwa folderu, w którym umieściłeś kod contextPath = nazwa folderu, w którym umieściłeś kod / Uwaga: uważnie obserwuj ukośnik.
źródło