web-dev-qa-db-fra.com

Ajouter un chemin de contexte à l'application Spring Boot

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?

145
CorreyS

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.

336
M. Deinum

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

  1. .yml

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

26
Abhishek Shah

Si vous utilisez Spring Boot 2.0.0, utilisez:

server.servlet.context-path
16
magemello

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

8
abdel

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.

7
Michael Simons

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;
2
Sanket

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.

1
Piyush Anjikar

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>
0
Gondri

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 
0
Ghulam Murtaza