Java Spring boot在端点之间传递了与@ModelAttribute相同的实例

Java Spring boot在端点之间传递了与@ModelAttribute相同的实例,java,rest,spring-boot,thymeleaf,endpoint,Java,Rest,Spring Boot,Thymeleaf,Endpoint,我有一个关于Thymeleaf和Spring Boot的问题。我正在创建一个表单向导,我希望在多个控制器之间传递同一个对象,以便该对象(SimpleCharacter)每次都存储来自每个页面的值 我现在拥有的是,对于每个端点,我会创建一个新对象,它“忘记”了我想从上一页存储的内容。我如何实现这一点,在端点之间传递相同的对象实例,并最终使用来自每个先前端点的字段完全完成对象 private static final String CHARACTER = "character"; @GetMapp

我有一个关于Thymeleaf和Spring Boot的问题。我正在创建一个表单向导,我希望在多个控制器之间传递同一个对象,以便该对象(SimpleCharacter)每次都存储来自每个页面的值

我现在拥有的是,对于每个端点,我会创建一个新对象,它“忘记”了我想从上一页存储的内容。我如何实现这一点,在端点之间传递相同的对象实例,并最终使用来自每个先前端点的字段完全完成对象

private static final String CHARACTER = "character";

@GetMapping(value = "/new-char/01_race")
public String showCharWizRace(Model model) {
    CharacterDto character = new SimpleCharacter();
    model.addAttribute(CHARACTER, character);
    return "new-char/01_race";
}

@PostMapping(value = "/new-char/02_class")
public String showCharWizClass(Model model, @ModelAttribute CharacterDto character) {
    model.addAttribute(CHARACTER, character);
    model.addAttribute("classes", charClassService.findAll());
    return "new-char/02_class";
}

@PostMapping(value = "/new-char/03_attributes")
public String showCharWizAttributes(Model model, @ModelAttribute CharacterDto character) {
    model.addAttribute(CHARACTER, character);
    return "new-char/03_attributes";
}
非常感谢您的宝贵提示和帮助。我在网上搜索过,但找不到任何有用的东西来为我指明正确的方向

编辑:但是如果您使characterd具有更多字段,例如种族、类别、属性,并且每次仅使用一个页面(一个表单)来提供一个字段,则spring在打开下一个表单时会“忘记”另一个属性。例如:第1页:比赛已设置,第2页(此处不存在比赛场)类已设置,但在此位置之前设置的比赛已被遗忘

字符到字段,应在每页上逐步填充:

private String race;
private String charClass;

private int strength;
private int endurance;
private int dexterity;
private int charisma;
private int intelligence;
private int perception;

private String name;
private String surname;
private String description;
private String title;
private String avatar;

首先,您的角色字段在spring表单中? 如果是,还可以将变量存储在隐藏字段中,并通过@RequestParam传递。 举个例子:

<input th:field="*{character}" name="character"/>
如果它不起作用,您还可以尝试在会话中使用模板策略之类的方法。 将变量放入会话作用域,在每次请求时更改变量,并在上次访问时将其删除

这里有一个关于从模板访问数据的好链接:

更新 您需要在工作流页面中组合模型和会话属性。 在控制器中添加指向正在使用的DTO的SessionAttribute,如下所示:

@Controller
@SessionAttributes("character")
public class WizardController { ..
当您完成流程后,可以通过这种方式结束会话属性

@GetMapping(value = "/new-char/04_clear")
public String clearSession(SessionStatus sessionStatus) {
    sessionStatus.setComplete();
    return "new-char/04_clear";
}

如果您查看我的示例代码,我会添加一个新页面来清理会话,并使用默认DTO值重新启动表单

嘿,非常感谢,我已经考虑过使用隐藏字段,但是这个解决方案对我来说似乎不那么优雅。。。这听起来有点像黑客,很遗憾Spring不能自己处理这个问题,也许我会试试sessionscope@Bloodlex我使用工作正常的ModelAttribute创建了一个简单的代码,与您的代码类似。看,我想我可以帮你。我想可能是一个表单配置,可能丢失了。这里还有另一个很好的例子:如果你想运行我的代码,就从页面开始,开始航行。请让我知道您的实现是否成功。我查看了您的代码,它是有效的,因为您只有一个字段始终存在于同一表单上。但是,如果您使SimpleCharacter具有更多字段,例如种族、类、属性,并且每次仅使用一个页面(一个表单)来提供一个字段,则spring在打开下一个表单时会“忘记”另一个属性。例如:设置了第1页:比赛,设置了第2页(此处不存在比赛场)类,但在此处,先前设置的比赛已被遗忘:(@Bloodlex我想我理解你的问题。事实上spring在请求之间丢失了值。所以你需要结合模型和会话属性。看看我现在提供的代码更新。
@GetMapping(value = "/new-char/04_clear")
public String clearSession(SessionStatus sessionStatus) {
    sessionStatus.setComplete();
    return "new-char/04_clear";
}