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.