web-dev-qa-db-fra.com

Impossible de résoudre la vue avec le nom «htmlviews / index.html» dans le servlet avec le nom «dispatcher» à l'aide de javaconfig

Je reçois une telle exception:

javax.servlet.ServletException: Could not resolve view with name 'htmlviews/index.html' in servlet with name 'dispatcher'
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:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.Java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:729)
org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)

lorsque j'essaie de me connecter à Java service Web Spring configuré.

Mes classes de configuration:

@Configuration
@EnableWebMvc
@ComponentScan({"config", "controller"})
public class MyWebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/htmlviews/**").addResourceLocations("/htmlviews/");
    }
}

Initialiseur:

    public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{MyWebConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

et contrôleur:

@Controller
public class IndexController {

    @RequestMapping(value = "/")
    public String getIndexPage() {
        return "htmlviews/index.html";
    }

    @RequestMapping(value = "/{[path:[^\\.]*}")
    public String index() {
        return "forward:/";
    }
}

l'ensemble de la structure du fichier est simple:

whole file srtucture is simple :

J'utilise Idea IDE (également essayé dans Eclipse, même exception) et j'essaie de déployer sur Tomcat. Dans pom.xml, J'ai ajouté la dépendance 'jstl', mais cela n'a pas aidé à résoudre le problème. En utilisant la configuration xml tout fonctionne bien. Je n'ai aucune idée de ce qui ne va pas avec mon ressort Java, c'est super simple, j'ai peut-être oublié quelque chose?

Corrigé Tout a commencé à fonctionner lorsque j'ai changé la version printemps de 4.1.0.RELEASE à 4.2.3.RELEASE. Je ne sais pas pourquoi cela ne fonctionne pas avec 4.1.0.RELEASE. Peut-être que quelqu'un peut expliquer, juste curieux.

6
Edgar

Problème

Spring essaie de trouver des vues sous votre répertoire webapp. Puisque vous n'avez pas view resolver, Spring ne peut pas résoudre "htmlviews/index.html". En d'autres termes, le printemps ne sait pas ce que c'est.
Vous disposez d'un Resource Resolver pour votre page html, ce qui est correct car le HTML est statique.

Solution possible 1

Dans votre classe MyWebConfig, ajoutez ce qui suit:

@Override
public void configureViewResolvers(final ViewResolverRegistry registry) {
    registry.jsp("/htmlviews/", ".jsp");
}  

OU vous pouvez le faire:

@Bean
public InternalResourceViewResolver jspViewResolver() {
    InternalResourceViewResolver resolver= new InternalResourceViewResolver();
    resolver.setPrefix("/htmlviews/");
    resolver.setSuffix(".jsp");
    return resolver;
}  

Changez votre page html en page jsp, je le recommande car jsp est tout simplement plus puissant que HTML.

Solution possible 2

Placez tous vos dossiers htmlviews sous les ressources afin que Spring puisse les trouver en fonction de votre résolveur de ressources.

Mettre à jour

Il est rare que le HTML soit nécessaire dans une application de démarrage Spring. Je recommande fortement d'utiliser un moteur de modèle (Thymeleaf est préférable). De cette façon, la configuration par défaut raisonnable est suffisante pour la plupart des applications multipages.

7
Minjun Yu

J'essayais d'implémenter une démo https://spring.io/guides/gs/securing-web/ mais je faisais face à un problème similaire, à noter - cette démo n'a que du html avec thymleaf (pas de JSP) et j'ai manqué d'ajouter la dépendance thymleaf (raison de l'erreur) plus tôt, il a montré une erreur

Circular view path []: would dispatch back to the current handler URL ..error

Ensuite, j'ai ajouté le résolveur de vue de bean et il a commencé à donner une erreur.

Could not resolve view with name..error

Enfin, cela a fonctionné après avoir supprimé le résolveur de vue du bean et ajouté la dépendance pour thymleaf. L'ajout de cela a fait mon travail.

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

Un peu plus d'aide que j'ai trouvé pour comprendre tout cela fonctionnant à Comment éviter l'exception "Circular view path" avec Spring MVC test

1
Vikash