Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring-BindingResult后的模型属性出现错误_Spring_Jsp_Model - Fatal编程技术网

Spring-BindingResult后的模型属性出现错误

Spring-BindingResult后的模型属性出现错误,spring,jsp,model,Spring,Jsp,Model,在下面的代码中,我只想创建一个新用户并将其链接到所选的组 当用户和组有效时,一切正常。当bindingresult出现错误时,问题就出现了。控制器检测到此类错误(目前为止一切正常),并返回相同的视图(我希望保留用户输入的数据),但组列表为空(我发现,再次显示视图后,userform.groups为空) 有人知道问题出在哪里吗 UserForm @Component public class UserForm { @Valid private User user; @Val

在下面的代码中,我只想创建一个新用户并将其链接到所选的组

当用户和组有效时,一切正常。当bindingresult出现错误时,问题就出现了。控制器检测到此类错误(目前为止一切正常),并返回相同的视图(我希望保留用户输入的数据),但组列表为空(我发现,再次显示视图后,userform.groups为空)

有人知道问题出在哪里吗

UserForm

@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";
    }
}