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 ?

4voto

Pedro Lopez Points 226

J'utilise Spring Boot avec Thymeleaf. C'est ce qui a fonctionné pour moi. Il y a des réponses similaires avec JSP, mais notez que j'utilise HTML, pas JSP, et qu'elles se trouvent dans le dossier src/main/resources/templates comme dans un projet Spring Boot standard, comme expliqué aquí . Cela pourrait aussi être votre cas.

@InjectMocks
private MyController myController;

@Before
public void setup()
{
    MockitoAnnotations.initMocks(this);

    this.mockMvc = MockMvcBuilders.standaloneSetup(myController)
                    .setViewResolvers(viewResolver())
                    .build();
}

private ViewResolver viewResolver()
{
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

    viewResolver.setPrefix("classpath:templates/");
    viewResolver.setSuffix(".html");

    return viewResolver;
}

J'espère que cela vous aidera.

4voto

Ishaan Arora Points 41

Ajouter l'annotation @ResponseBody à votre retour de méthode.

3voto

Max Points 31

Lors de l'exécution de Spring Boot + Freemarker, si la page apparaît :

Whitelabel Error Page Cette application n'a pas de mappage explicite pour / erreur, donc vous voyez ceci comme une solution de rechange.

Dans la version spring-boot-starter-parent 2.2.1.RELEASE, freemarker ne fonctionne pas :

  1. renommer les fichiers Freemarker de .ftl en .ftlh
  2. Ajouter à application.properties : spring.freemarker.expose-request-attributes = true

spring.freemarker.suffixe = .ftl

2voto

Pour la feuille de thym :

Je viens de commencer à utiliser spring 4 et thymeleaf, lorsque j'ai rencontré cette erreur, elle a été résolue en ajoutant :

<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
  <property name="templateEngine" ref="templateEngine" />
  <property name="order" value="0" />
</bean>

1voto

Gowri Ayyanar Points 11

Lorsque vous utilisez @Controller vous devez @RequestMapping y @ResponseBody annotations. Réessayez après avoir ajouté une annotation @ResponseBody

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