有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java验证器+MVC+REST::更新问题

我正在尝试使用REST和SpringMVC构建我的应用程序。对于某些实体,我有专门的页面进行更新。数据提交后,进行验证。若并没有错误,它将重定向到此实体的视图,以其他方式编辑页面。我必须在控制器之间传递数据(实体和验证器结果)吗

这里有一些非常糟糕的实践

@RequestMapping(method = RequestMethod.PUT, value = "/workers/{id}")
public ModelAndView update(@PathVariable final Long id, @Valid Worker entity, Errors errors, NativeWebRequest request) {
    ModelAndView model = new ModelAndView();
    entity.setId(id);
    if (errors.hasErrors()) {
        request.setAttribute("entity", entity, RequestAttributes.SCOPE_SESSION);
        request.setAttribute("errors", errors.getAllErrors(), RequestAttributes.SCOPE_SESSION);
        model.setViewName("redirect:/workers/" + entity.getId()+ "/edit");
    } else {
        System.out.println("upd-done");
        service.update(entity);
        model.setViewName("redirect:/workers/" + entity.getId());
        model.addObject(entity);
    }
    return model;
}

@RequestMapping(method = RequestMethod.GET, value = "/workers/{id}/edit")
public ModelAndView updatePage(@PathVariable Long id, NativeWebRequest request) {
    ModelAndView model = new ModelAndView();
    DomainObject entity = (DomainObject)request.getAttribute("entity", RequestAttributes.SCOPE_SESSION);
    model.addObject("entity", entity != null ? entity : service.get(id));
    model.setViewName(names.provideViewName(Pages.EDIT));
    return model;
}

这里有一张表格供编辑

<form id="entity" action="/workers/6" method="post"><input type="hidden" name="_method" value="PUT"/>
foo <input id="foo" name="foo" type="text" /></td>
<input type="submit" value="Save Changes" />
</form>

谢谢


共 (1) 个答案

  1. # 1 楼答案

    当出现错误并且需要将用户发送回表单视图时,只需使用在GET/edit方法中使用的相同视图名称(“names.provideViewName(Pages.edit)”)。您需要修改该视图,以检查模型中是否存在错误,如果存在,则向用户显示错误

    @RequestMapping(method = RequestMethod.PUT, value = "/workers/{id}")
    public ModelAndView update(@PathVariable final Long id, @Valid Worker entity, Errors errors, NativeWebRequest request) {
        ModelAndView model = new ModelAndView();
        entity.setId(id);
        if (errors.hasErrors()) {
            model.addObject("entity", entity);
            model.addObject("errors", errors);
            model.setViewName(names.provideViewName(Pages.EDIT));
        } else {
            System.out.println("upd-done");
            service.update(entity);
            model.setViewName("redirect:/workers/" + entity.getId());
            model.addObject(entity);
        }
        return model;
    }