Spring-BindingResult后的模型属性出现错误
在下面的代码中,我只想创建一个新用户并将其链接到所选的组 当用户和组有效时,一切正常。当bindingresult出现错误时,问题就出现了。控制器检测到此类错误(目前为止一切正常),并返回相同的视图(我希望保留用户输入的数据),但组列表为空(我发现,再次显示视图后,userform.groups为空) 有人知道问题出在哪里吗 UserFormSpring-BindingResult后的模型属性出现错误,spring,jsp,model,Spring,Jsp,Model,在下面的代码中,我只想创建一个新用户并将其链接到所选的组 当用户和组有效时,一切正常。当bindingresult出现错误时,问题就出现了。控制器检测到此类错误(目前为止一切正常),并返回相同的视图(我希望保留用户输入的数据),但组列表为空(我发现,再次显示视图后,userform.groups为空) 有人知道问题出在哪里吗 UserForm @Component public class UserForm { @Valid private User user; @Val
@Component
public class UserForm {
@Valid
private User user;
@Valid
private Collection<Group> allGroups;
// Setters and getters
}
CreateUser.jsp(仅关于组的部分)
用户名:
创造
感谢您的帮助 这是因为有关验证错误的信息在重定向后丢失。
可以使用重定向属性解决此问题。检查教程 重新创建对象,并将值绑定到结果对象。这意味着没有组对象 同样,这些也不应该在对象中。要解决此问题,请使用带注释的方法
@modeldattribute
,该方法将为每个请求处理方法调用,并创建一个对象并填充组列表
@ModelAttribute
public void init(Model model) {
UserForm userForm = new UserForm();
userForm.setUser(new User());
model.addAttribute("userform", userForm);
model.addAtrribute("groups", userGroupService.getAllEnabledGroups());
}
@RequestMapping(value = "/admin/users/CreateUser", method = RequestMethod.GET)
public String createUsetGet () {
return "/admin/users/CreateUser";
}
@RequestMapping(value = "/admin/users/CreateUser", method = RequestMethod.POST)
public String createUserPost (@Valid @ModelAttribute("userform") UserForm userForm, BindingResult result) {
if (result.hasErrors() == true) {
return "/admin/users/CreateUser";
}
userForm.getUser().setPassword(passwordEncoder.encode(userForm.getUser().getPassword()));
userGroupService.saveUser(userForm.getUser());
return "redirect:/admin/users/ViewUsers";
}
当然,您的jsp也必须稍微更改
<form:select path="user.groups" multiple="true">
<form:options items="${groups}" itemValue="id" itemLabel="name" />
</form:select>
成功后,您需要告诉
SessionStatus
您已经完成。如果您不这样做,您的会话可能会造成污染。但是如果对象无效(result.hasErrors()==true
),我不会重定向页面(重定向:/admin/users/CreateUser
),而是将相同的视图发回(/admin/users/CreateUser
),因此该模型应该是未被触及的。不,它不是。如果重定向成功,再次调用createUserGet
方法,则检测到错误时不会出现这种情况。相同的视图名称和url误导了我。我习惯于发布重定向获取模式。很抱歉谢谢我一开始不明白你的意思。我也尝试过这种方法,效果非常好!这么好的回答!今晚我要试试这个办法。谢谢关于@SessionAttribute
我还有一个问题:如果我添加了一个“取消”按钮(意思是“我不想创建用户”),如何防止污染会话?我应该在控制器内创建一个新方法,只将状态设置为完成还是…再次感谢!你的答案很完美!我再次问您:当我“取消”创建用户时,如何防止污染会话?:)在这里定义取消。如果它是一个按钮按下,你可以简单地添加一个方法到你的控制器来处理它。否则就没有办法了。谢谢!这正是我需要的。
@ModelAttribute
public void init(Model model) {
UserForm userForm = new UserForm();
userForm.setUser(new User());
model.addAttribute("userform", userForm);
model.addAtrribute("groups", userGroupService.getAllEnabledGroups());
}
@RequestMapping(value = "/admin/users/CreateUser", method = RequestMethod.GET)
public String createUsetGet () {
return "/admin/users/CreateUser";
}
@RequestMapping(value = "/admin/users/CreateUser", method = RequestMethod.POST)
public String createUserPost (@Valid @ModelAttribute("userform") UserForm userForm, BindingResult result) {
if (result.hasErrors() == true) {
return "/admin/users/CreateUser";
}
userForm.getUser().setPassword(passwordEncoder.encode(userForm.getUser().getPassword()));
userGroupService.saveUser(userForm.getUser());
return "redirect:/admin/users/ViewUsers";
}
<form:select path="user.groups" multiple="true">
<form:options items="${groups}" itemValue="id" itemLabel="name" />
</form:select>
@Controller
@SessionAttributes("groups")
public class UserController {
@Autowired
UserGroupService userGroupService;
@Autowired
BCryptPasswordEncoder passwordEncoder;
@InitBinder
public void initBinder (WebDataBinder binder) {
binder.registerCustomEditor(Set.class, "userform.user.groups", new GroupListEditor(userGroupService));
}
@ModelAttribute("groups")
public List<Group> groups() {
return userGroupService.getAllEnabledGroups();
}
@ModelAttribute("userform")
public UserForm userform() {
UserForm userForm = new UserForm();
userForm.setUser(new User());
return userForm;
}
@RequestMapping(value = "/admin/users/CreateUser", method = RequestMethod.GET)
public String createUsetGet () {
return "/admin/users/CreateUser";
}
@RequestMapping(value = "/admin/users/CreateUser", method = RequestMethod.POST)
public String createUserPost (@Valid @ModelAttribute("userform") UserForm userForm, BindingResult result, SessionStatus status) {
if (result.hasErrors() == true) {
return "/admin/users/CreateUser";
}
userForm.getUser().setPassword(passwordEncoder.encode(userForm.getUser().getPassword()));
userGroupService.saveUser(userForm.getUser());
status.setComplete();
return "redirect:/admin/users/ViewUsers";
}
}