Lors de la redirection d'un point de terminaison vers un autre, vous pouvez utiliser l'étendue flash pour hériter des paramètres vers la destination de la redirection.
Lorsque vous accédez à / from
avec GET avec le contrôleur suivant, redirigez vers / vers
.
Dans le processus de la source de la redirection, le «bookName» et la «BuyerList» sont poussés dans la portée flash et repris vers la destination de la redirection.
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.util.Arrays;
import java.util.List;
@Controller
public class DemoController {
@GetMapping(path = "/from")
public String from(RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("bookName", "Doraemon");
List<String> buyerList = Arrays.asList("Nobi", "Gouda");
redirectAttributes.addFlashAttribute("buyerList", buyerList);
return "redirect:/to";
}
@GetMapping(path = "/to")
public String to(Model model) {
System.out.println(model);
return "demo";
}
}
Lorsque vous accédez à / from
, vous serez redirigé vers / vers
et les paramètres hérités seront affichés sur la console.
{bookName=Doraemon, buyerList=[Nobi,Gouda]}
--Définissez RedirectAttributes
comme argument dans la méthode source de redirection, et spécifiez le nom de l'attribut et le contenu à hériter dans .addFlashAttribute
. Le nom d'attribut peut être omis, mais dans ce cas, le nom d'attribut est automatiquement défini en fonction du nom de la classe.
--A la destination de la redirection, l'attribut est inclus dans l'ensemble Model
de l'argument. Si vous voulez faire référence au contenu, spécifiez le nom de l'attribut avec .getAttribute
.
Assurez-vous que lorsque vous accédez à / from
, vous hériterez des paramètres et serez redirigé vers / vers
.
package com.example.demo.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import java.util.Arrays;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.flash;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class DemoControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void redirectWithAttributes() throws Exception {
mockMvc.perform(get("/from"))
.andExpect(status().isFound())
.andExpect(redirectedUrl("/to"))
.andExpect(flash().attribute("bookName", "Doraemon"))
.andExpect(flash().attribute("buyerList", Arrays.asList("Nobi", "Gouda")));
}
}
--Vérifiez avec ʻandExpect () `que cela fonctionne comme prévu.
redirectedUrl ()
.
--Évaluation des paramètres à hériter par flash (). Attribute ()
.FlashMap
Le paramètre de prise de contrôle peut être récupéré avec FlashMap
comme suit. Utilisez cette option si vous souhaitez confirmer qu'il n'y a pas de paramètres supplémentaires ou si vous ne pouvez pas faire une assertion avec une expression de chaîne de caractères simple.
@Test
public void redirectWithAttributes() throws Exception {
MvcResult mvcResult = mockMvc.perform(get("/from"))
.andExpect(status().isFound())
.andExpect(redirectedUrl("/to"))
.andReturn();
FlashMap flashMap = mvcResult.getFlashMap();
assertThat(flashMap.size()).isEqualTo(2);
assertThat(flashMap.get("bookName")).isEqualTo("Doraemon");
assertThat(flashMap.get("buyerList")).isEqualTo(Arrays.asList("Nobi", "Gouda"));