164 votes

Comment éviter l'exception " Circular view path " avec le test Spring MVC

J'ai le code suivant dans un de mes contrôleurs :

@Controller
@RequestMapping("/preference")
public class PreferenceController {

    @RequestMapping(method = RequestMethod.GET, produces = "text/html")
    public String preference() {
        return "preference";
    }
}

J'essaie simplement de le tester en utilisant Test de Spring MVC comme suit :

@ContextConfiguration
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class PreferenceControllerTest {

    @Autowired
    private WebApplicationContext ctx;

    private MockMvc mockMvc;
    @Before
    public void setup() {
        mockMvc = webAppContextSetup(ctx).build();
    }

    @Test
    public void circularViewPathIssue() throws Exception {
        mockMvc.perform(get("/preference"))
               .andDo(print());
    }
}

J'obtiens l'exception suivante :

Chemin d'accès circulaire [préférence] : renvoie à l'URL du gestionnaire actuel [/préférence]. gestionnaire actuel [/préférence]. Vérifiez la configuration de votre ViewResolver ! (Indice : Cela peut être le résultat d'une vue non spécifiée, en raison de la vue par défaut. par défaut).

Ce que je trouve étrange, c'est que cela fonctionne bien lorsque je charge la configuration contextuelle "complète". qui inclut le modèle et les résolveurs de vue comme indiqué ci-dessous :

<bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver" id="webTemplateResolver">
    <property name="prefix" value="WEB-INF/web-templates/" />
    <property name="suffix" value=".html" />
    <property name="templateMode" value="HTML5" />
    <property name="characterEncoding" value="UTF-8" />
    <property name="order" value="2" />
    <property name="cacheable" value="false" />
</bean>

Je suis bien conscient que le préfixe ajouté par le résolveur de modèle garantit qu'il n'y a pas de "chemin de vue circulaire" lorsque l'application utilise ce résolveur de modèle.

Mais alors comment suis-je censé tester mon application en utilisant le test Spring MVC ?

0voto

alijandro Points 3693

J'utilise l'annotation pour configurer l'application web de Spring. Le problème a été résolu en ajoutant une annotation de type InternalResourceViewResolver à la configuration. J'espère que cela vous sera utile.

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.example.springmvc" })
public class WebMvcConfig extends WebMvcConfigurerAdapter {

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

0voto

xpioneer Points 390

Cela se produit parce que Spring supprime la "préférence" et l'ajoute à nouveau en créant le même chemin que l'Uri de la requête.

Cela se passe comme ça : demande Uri : "/préférence"

supprimer "préférence" : "/"

ajouter le chemin : "/"+"préférence"

fin de la chaîne : "/préférence"

Vous vous retrouvez dans une boucle dont le Spring vous informe en lançant une exception.

Il est dans votre intérêt de donner un nom de vue différent, comme "preferenceView" ou tout autre nom de votre choix.

0voto

aishwarya kore Points 11

Essayez d'ajouter la dépendance compile("org.springframework.boot:spring-boot-starter-thymeleaf") à votre fichier gradle.Thymeleaf permet de mapper les vues.

0voto

Faouzi Points 58

Dans mon cas, j'ai eu ce problème en essayant de servir des pages JSP en utilisant l'application Spring boot.

Voici ce qui a marché pour moi :

application.properties

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

pom.xml

Pour permettre la prise en charge des JSP, nous devons ajouter une dépendance sur tomcat-embed-jasper.

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

0voto

sermyro Points 11

Dans mon cas, le chemin de vue circulaire dans spring boot 2 et jdk 11 a été corrigé en redirigeant vers index.html :

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            }
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/").setViewName("redirect:/index.html");
            }
        };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X