2016-12-05 9 views
1

Notre problème est que nous ne savons tout simplement pas comment dire à Tomcat notre index.html n'est plus au plus haut niveau du dossier webapp, c'est un dossier plus profond .Tomcat ne peut pas trouver l'index lorsqu'il n'est pas au niveau supérieur de webapp dir

Notre application sur le serveur est un projet Spring, Maven, Hibernate déployé sur Tomcat9. Sur le front, nous utilisons Angular2 avec la magie Angular-CLI. Le back-end et le front-end sont deux projets distincts, donc les mecs frontaux n'ont pas besoin de gérer Java et vice-versa. Ensuite, nous utilisons simplement un peu de magie de construction pour combiner les artefacts déployables Angular2 dans le dossier webapp afin que Maven puisse l'emballer dans le WAR.

Nous nous sommes retrouvés dans ce scénario à cause d'Angular-CLI et de la façon dont il veut disposer le projet, comme ci-dessous. L'index.html fait référence aux modules node_modules directement d'un côté et de l'autre et angular-cli n'aime pas que nous changions cela.

(1) un bâti projet angulaire-cli

|-- web-project 
    |-- src 
     |-- index.html 
    |-- node_modules 
    |-- package.json 
    |-- angular-cli.json 

(2) Structure quand intégré projet Maven. Le dossier dist est généré par angulaire-cli pour les artefacts déployables.

|-- webapp 
    |-- dist 
     |-- index.html 
    |-- node_modules 
    |-- WEB-INF 
     |-- web.xml 
     |-- (bunch of spring configs) 

Avant-angulaire CLI nous venons d'utiliser la mise en page décrit dans le principal tutoriel de sites Angular2 à partir du lien ci-dessous. Ce tutoriel a beaucoup changé depuis que j'ai vérifié en dernier.

Angular2 Main Tutorial

La mise en page de la façon originale travaillé tout à fait bien avec Tomcat car le fichier « index.html » était au niveau supérieur avec une structure comme ci-dessous. Cependant Angular-CLI a effacé un tas de tâches nécessaires pour la construction, de sorte que la CLI est la voie à suivre.

|-- webapp 
    |-- index.html 
    |-- node_modules 
    |-- WEB-INF 

Plus tôt nous avions une fourchette dans la route où nous pourrions soit (1) dire tomcat à ce sujet, ou (2) modifier la configuration angulaire CLI. Comme le CLI est si nouveau et que la structure a du sens, je me suis dit que Tomcat gérerait mieux cette énigme et que plus de peeps pourraient m'aider.

Il y a deux fichiers qui semblent être l'endroit idéal pour y parvenir.

(1) ressource-mapping.xml (une configuration de ressort)

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 


    <!-- Handles HTTP GET requests for the index.html file --> 
    <!-- Huh? How does this work? --> 
    <resources mapping="/*" location="/" /> 

    <!-- Handles HTTP GET requests for /resources/** by serving static resources in the ${webappRoot}/resources directory --> 
    <resources mapping="/resources/**" location="/resources/" /> 

    <resources mapping="/node_modules/**" location="/node_modules/" /> 

    <resources mapping="/themes/**" location="/themes/" /> 

    <!-- Opens up the dist folder --> 
    <resources mapping="/dist/**" location="/dist/" /> 

</beans:beans> 

(2) MainController.java

package com.mydomain.myapp; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

/** 
* Handles requests for the application home page. 
* @author Some friends and I 
*/ 
@Controller 
public class MainController { 

    /** 
    * Simply selects the home view statically by forwarding to index.html 
    * 
    * @return "/index.html". 
    */ 
    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home() { 
     return "/index.html"; 
    } 

} 

Dans la configuration de ressort ci-dessus, le premier mappage fonctionne en quelque sorte en même temps que avec le fichier java MainController pour servir le fichier index.html. La plupart de notre problème provient de ne pas savoir comment ou pourquoi cela fonctionne réellement et nous n'avons jamais eu l'index.html n'importe où, mais le plus haut niveau avant. Jusqu'à présent, nous avons essayé certaines des approches les plus évidentes en mettant dist à l'avant des chemins comme suit: return "/dist/index.html", mais en vain.

Nous avons essayé pas mal de combinaisons mais nous obtenons toujours la même erreur avec quelques mots changés.

type Exception report 

message Could not resolve view with name '/dist/index.html' in servlet with name 'appServlet' 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

javax.servlet.ServletException: Could not resolve view with name '/dist/index.html' in servlet with name 'appServlet' 
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1211) 
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 
note The full stack trace of the root cause is available in the Apache Tomcat/9.0.0.M9 logs. 

ne quelqu'un voit donc ce que je suis absent ici? Quelqu'un d'autre a-t-il déjà l'index.html ailleurs qu'à un niveau supérieur?

Répondre

0

Utilisez le fichier web.xml et ajoutez une balise

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> 
    <display-name>test</display-name> 
    <welcome-file-list> 
    <welcome-file>dist/index.html</welcome-file> 
    </welcome-file-list> 
    ....rest of tags... 
</web-app> 
+0

Ouais qui a fait l'affaire. J'ai même pensé à cela, mais pour une raison quelconque, j'ai pensé que Spring gérerait cela à la place. On dirait que cela rend notre MainController.java inutile. –