GOOGLE ADS

lundi 18 avril 2022

Comment éviter l'exception "Chemin de vue circulaire" 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 le test 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 à la vue circulaire [preference] : redirigerait vers l'URL du gestionnaire actuel [/preference] à nouveau. Vérifiez votre configuration ViewResolver ! (Astuce : cela peut être le résultat d'une vue non spécifiée, en raison de la génération de nom de vue par défaut.)

Ce que je trouve étrange, c'est que cela fonctionne bien lorsque je charge la configuration de contexte "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 à l'aide du test Spring MVC?


Solution du problème

@Controller@RestController

J'ai eu le même problème et j'ai remarqué que mon contrôleur était également annoté avec @Controller. Le remplacer par a @RestControllerrésolu le problème. Voici l'explication de Spring Web MVC:

@RestController est une annotation composée qui est elle-même méta-annotée avec @Controller et @ResponseBody indiquant un contrôleur dont chaque méthode hérite de l'annotation @ResponseBody au niveau du type et écrit donc directement dans le corps de la réponse par rapport à la résolution de la vue et au rendu avec un modèle HTML.

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...