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?

124
demandé sur nbro 2013-12-05 20:33:59

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).

280
répondu M. Deinum 2017-09-01 05:39:57

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

  1. .yml

  2. .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

24
répondu Abhishek Shah 2017-02-28 10:42:33

si vous utilisez une botte de printemps 2.0.0, utilisez:

server.servlet.context-path
11
répondu magemello 2018-01-18 16:00:27

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.

5
répondu Michael Simons 2017-04-24 09:03:36

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;
2
répondu Sanket 2017-02-28 10:43:42

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.

1
répondu Piyush Anjikar 2017-11-11 16:13:40

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>
0
répondu Gondri 2017-11-01 13:08:22

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

0
répondu abdel 2018-08-02 14:47:59
Le chemin de contexte

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.

-1
répondu saravanan 2017-11-10 13:12:23