从 Spring 控制器中删除重复项

2024-02-13

我一直在寻找一种方法来减少 Spring MVC 控制器中因细微差异而重复的代码量,但到目前为止搜索 SO 问题只产生了一些问题,没有任何令人满意的答案。

我想要删除的重复示例是这样的,其中用户创建页面和角色创建页面有相似之处:

  @RequestMapping(value = "user/create", method = RequestMethod.GET)
  public String create(@ModelAttribute("user") User user, BindingResult errors) {
    LOG.debug("Displaying user creation page.");
    return "user/create";
  }

  @RequestMapping(value = "role/create", method = RequestMethod.GET)
  public String create(@ModelAttribute("role") Role role, BindingResult errors) {
    LOG.debug("Displaying role creation page.");
    return "role/create";
  }

我想删除的一种稍微复杂的重复变体是用于发布创建表单的重复变体:

  @RequestMapping(value = "user/create", method = RequestMethod.POST)
  public String save(@ModelAttribute("user") User user, BindingResult errors) {
    LOG.debug("Entering save ({})", user);
    validator.validate(user, errors);
    validator.validatePassword(user, errors);
    validator.validateUsernameAvailable(user, errors);
    String encodedPassword = encoder.encode(user.getPassword());
    user.setPassword(encodedPassword);
    if (errors.hasErrors()) {
      return create(user, errors);
    } else {
      service.save(user);
    }
    return "redirect:/user/index/1";
  }

  @RequestMapping(value = "role/create", method = RequestMethod.POST)
  public String save(@ModelAttribute("role") Role role, BindingResult errors) {
    LOG.debug("Entering save({})", role);
    validator.validate(role, errors);
    if (errors.hasErrors()) {
      return create(role, errors);
    } else {
      service.save(role);
    }
    return "redirect:/index";
  }

此示例包括验证,如果正确则保存,以及如果事情未按计划进行则重定向到错误页面。

如何删除这个重复项?


Spring 使用处理程序方法参数类型从请求参数或主体创建类实例。因此,无法创建处理程序(@RequestMapping) 方法可能需要Object并检查它是否是Role or a User。 (从技术上讲,您可以同时拥有这两个参数,然后检查哪一个不是null,但这是糟糕的设计)。

因此,您需要为每个处理程序方法。这是有道理的,因为即使逻辑相似,它仍然特定于您尝试创建的模型对象的确切类型。您执行不同的验证,调用不同的服务方法,并返回不同的视图名称。

我说你的代码没问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Spring 控制器中删除重复项 的相关文章

随机推荐