Ajouter un chemin de contexte à L'application de démarrage à ressort
  j'essaie de définir un contexte D'application de démarrage à ressort de façon programmatique. La raison de la racine du 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 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 de 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 d'au   localhost:12378/mainstay , mais il est toujours situé à localhost:12378 .   
Qu'est-ce qui me manque pour que Spring Boot n'ajoute pas la racine du contexte avant la mise en correspondance de la requête?
9 réponses
pourquoi essayez-vous de lancer votre propre solution. Spring-boot supporte déjà cela.
 si vous n'en avez pas déjà un, ajoutez un fichier application.properties à src\main\resources . Dans ce fichier de propriétés, ajouter 2 propriétés:  
server.contextPath=/mainstay
server.port=12378
  
  mise à JOUR (Printemps Boot 2.0)
  à partir de la botte de printemps 2.0 (en raison du soutien de MVC de printemps et Webflux de printemps) le  contextPath  a été modifié à la  
server.servlet.contextPath=/mainstay
  
    vous pouvez alors supprimer votre configuration pour le conteneur servlet personnalisé. Si vous avez besoin de faire un post processing 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 servir comme une valeur par défaut, vous pouvez toujours les outrepasser en utilisant un autre  application.properties  à côté de l'artefact que vous livrez ou en ajoutant JVM les paramètres (  -Dserver.port=6666  ).  
Voir aussi le Guide de référence en particulier la section propriétés .
 la classe   ServerProperties   met en œuvre 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   fait un null check mais comme la valeur par défaut est "" elle échoue toujours et définit le contexte à  ""  et donc l'annulation de la vôtre).  
si vous utilisez Spring Boot, vous n'avez pas à configurer les propriétés du serveur via L'initialisation de Vean.
 à la place, si une fonctionnalité est disponible pour la configuration de base, alors elle peut être définie dans un fichier de" propriétés "appelé application , qui devrait résider sous src\main\resources  dans votre structure d'application. Le fichier" propriétés "est disponible en deux formats 
-    
.yml -    
.properties 
la façon dont vous spécifiez ou définissez les configurations diffère d'un format à l'autre.
  dans votre cas particulier, si vous décidez d'utiliser l'extension  .properties , alors vous aurez un fichier appelé  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 le  .yml   extension (i.e.  application.yml  ), vous devez définir les configurations en utilisant le format suivant (i.e.  YAML ):  
server:
    port: 8080
    contextPath: /context-path
  
  pour les propriétés plus courantes de la botte à ressort, voir le lien ci-dessous:
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
si vous utilisez une botte de printemps 2.0.0, utilisez:
server.servlet.context-path
  
    	                les propriétés correctes sont
server.servlet.path
  
  pour configurer le chemin d'accès du répartiteur
et
server.servlet.context-path
  
  pour configurer le chemin du contexte d'applications en dessous de cela.
  Nous pouvons définir dans le  application.properties  comme
  API_CONTEXT_ROOT=/therootpath   
et nous y accédons dans la classe Java comme indiqué ci-dessous
@Value("${API_CONTEXT_ROOT}")
private String contextRoot;
  
    	                Dans La Botte De Printemps 1.5:
  ajouter le bien suivant dans  application.properties :  
server.context-path=/demo
  
   Note: /demo  est votre URL de chemin de contexte.  
server.contextPath=/pilier
fonctionne pour moi si j'avais un dossier de guerre à JBOSS. Parmi plusieurs fichiers de guerre où chacun contient jboss-web.xml, il ne fonctionne pas. J'ai dû mettre jboss-web.xml à l'intérieur de répertoire WEB-INF de 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>
  
    	                veuillez noter que le serveur".contexte-chemin" ou "server".servlet.context-path" [à partir de springboot 2.0.X] les propriétés ne fonctionneront que si vous vous déployez sur un conteneur imbriqué, par exemple Tomcat imbriqué. Ces propriétés n'aura aucun effet si vous déployez votre application comme une guerre externe, tomcat par exemple.
voir cette réponse ici: https://stackoverflow.com/a/43856300/4449859
peut être directement intégré au code, mais il n'est pas conseillé car il ne peut pas être réutilisé.fichier de propriétés serveur.contextPath=/nom du dossier où vous avez placé le code contextPath = nom du dossier où vous avez placé le code/ Remarque:observez la barre oblique soigneusement.