J'essaie de définir une racine de contexte d'applications Spring Boot par programme. La raison de la racine de contexte est que nous voulons que l'application soit accessible à partir de localhost:port/{app_name}
et que tous les chemins du contrôleur y soient ajoutés.
Voici le fichier de configuration de l'application pour l'application 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;
}
}
Voici le contrôleur d'index pour la page principale.
@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";
}
}
La nouvelle racine de l'application doit être à localhost:12378/mainstay
, mais elle se trouve toujours à localhost:12378
.
Que manque-t-il pour empêcher Spring Boot d'ajouter la racine de contexte avant le mappage de la demande?
Pourquoi essayez-vous de lancer votre propre solution. Spring-boot le supporte déjà.
Si vous n'en avez pas déjà un, ajoutez un fichier application.properties
à src\main\resources
. Dans ce fichier de propriétés, ajoutez 2 propriétés:
server.contextPath=/mainstay
server.port=12378
UPDATE (Spring Boot 2.0)
A partir de Spring Boot 2.0 (en raison de la prise en charge de Spring MVC et de Spring WebFlux), contextPath
a été remplacé par le suivant:
server.servlet.contextPath=/mainstay
Vous pouvez ensuite supprimer votre configuration pour le conteneur de servlets personnalisé. Si vous devez effectuer un post-traitement sur le conteneur, vous pouvez ajouter une implémentation EmbeddedServletContainerCustomizer
à votre configuration (par exemple, pour ajouter les pages d'erreur).
Fondamentalement, les propriétés à l'intérieur du application.properties
servent de propriétés par défaut. Vous pouvez toujours les remplacer en utilisant un autre application.properties
à côté de l'artefact que vous livrez ou en ajoutant des paramètres JVM (-Dserver.port=6666
).
Voir aussi Le Guide de référence en particulier la section propriétés .
La classe ServerProperties
implémente le EmbeddedServletContainerCustomizer
. La valeur par défaut pour contextPath
est ""
. Dans votre exemple de code, vous définissez le contextPath
directement sur le TomcatEmbeddedServletContainerFactory
. Ensuite, l'instance ServerProperties
traitera cette instance et la réinitialisera de votre chemin vers ""
. ( Cette ligne effectue une vérification null
mais la valeur par défaut est ""
et elle échoue toujours. Définissez le contexte sur ""
et écrasez ainsi le vôtre.
Si vous utilisez Spring Boot, vous n'avez pas besoin de configurer les propriétés du serveur via l'initialisation Vean.
Au lieu de cela, si une fonctionnalité est disponible pour la configuration de base, elle peut être définie dans un fichier "propriétés" appelé application
, qui devrait résider sous src\main\resources
dans la structure de votre application. Le fichier "propriétés" est disponible en deux formats
.yml
.properties
La manière dont vous spécifiez ou définissez les configurations diffère d’un format à l’autre.
Dans votre cas spécifique, si vous décidez d'utiliser l'extension .properties
, vous obtiendrez un fichier nommé application.properties
sous src\main\resources
avec les paramètres de configuration suivants.
server.port = 8080
server.contextPath = /context-path
OTOH, si vous décidez d’utiliser l’extension .yml
(c’est-à-dire application.yml
), vous devrez définir les configurations au format suivant (c.-à-d. YAML
):
server:
port: 8080
contextPath: /context-path
Pour plus de propriétés communes de Spring Boot, reportez-vous au lien ci-dessous:
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Si vous utilisez Spring Boot 2.0.0, utilisez:
server.servlet.context-path
notez que les propriétés "server.context-path" ou "server.servlet.context-path" [à partir de springboot 2.0.x] ne fonctionneront que si vous effectuez un déploiement dans un conteneur incorporé, par exemple Tomcat incorporé. Ces propriétés n'auront aucun effet si vous déployez votre application en tant que guerre auprès d'un Tomcat externe, par exemple.
voir cette réponse ici: https://stackoverflow.com/a/43856300/4449859
Les propriétés correctes sont
server.servlet.path
configurer le chemin du DispatcherServlet
et
server.servlet.context-path
pour configurer le chemin du contexte des applications ci-dessous.
Nous pouvons le définir dans le application.properties
comme API_CONTEXT_ROOT=/therootpath
Et nous y avons accès dans la classe Java mentionnée ci-dessous
@Value("${API_CONTEXT_ROOT}")
private String contextRoot;
Dans Spring Boot 1.5:
Ajoutez la propriété suivante dans application.properties
:
server.context-path=/demo
Remarque: /demo
est votre URL de chemin de contexte.
server.contextPath =/mainstay
fonctionne pour moi si j’avais un fichier de guerre dans JBOSS. Cela n'a pas fonctionné parmi plusieurs fichiers war contenant chacun jboss-web.xml. J'ai dû mettre jboss-web.xml dans le répertoire WEB-INF avec le contenu
<?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>
Vous pouvez le faire en ajoutant facilement le port et le chemin de contexte pour ajouter la configuration dans le fichier [src\main\resources] .properties et le fichier .yml.
configuration du fichier application.porperties
server.port = 8084
server.contextPath = /context-path
configuration du fichier application.yml
server:
port: 8084
contextPath: /context-path
Nous pouvons également le changer par programmation dans la botte de printemps.
@Component
public class ServerPortCustomizer implements WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {
@Override
public void customize(EmbeddedServletContainerCustomizer factory) {
factory.setContextPath("/context-path");
factory.setPort(8084);
}
}
Nous pouvons aussi ajouter un autre moyen
@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);
}
}
en utilisant Java commande print boot 1.X
Java -jar my-app.jar --server.contextPath=/spring-boot-app --server.port=8585
en utilisant Java commande printemps boot 2.X
Java -jar my-app.jar --server.servlet.context-path=/spring-boot-app --server.port=8585