【问题标题】:Spring : Controller and Service Layer coding standard exampleSpring:控制器和服务层编码标准示例
【发布时间】:2015-02-05 20:34:47
【问题描述】:

我正在检查我的项目代码并在控制器中找到以下方法。在网上我发现controller 用于接收请求并提供响应。 Service 层用于业务逻辑,Dao 层用于数据 CRUD 相关操作。

在下面的方法中,我可以看到业务逻辑。现在我没有得到应该将哪些代码移到服务层或以下是好的。

我正在审查代码,所以我需要提供 cmets,但我很困惑。

       @RequestMapping(value = "/admin/app", method = RequestMethod.POST)
       public ModelAndView saveApp(
                 @ModelAttribute("application") @Validated Application application,
                 BindingResult result) {

          ModelAndView model = new ModelAndView();
          ApplicationFormValidator formValidation = new ApplicationFormValidator();
          boolean messageFlag = false;
          String operationalStatus = null;
          formValidation.validate(application, result);
          if (result.hasErrors()) {
                 model.addObject(APPLICATION, application);
                 model.setViewName(ADD_APP);

          } else {
                 if(checkActive(application)){

                                status = FormBeanValidator.encodeStatus(application.getStatus());
                       application.setStatus(status);
                       // calling service layer and convert model into entity
                       messageFlag = applicationService.addApp(application);

                       if (messageFlag) {
                              Application applicationForm = new Application();
                              applicationForm.setSuccessMessage(PropertyHandler.getPropertyInstance().getPropertyValue(Constants.SUCCESS_MESSAGE));
                              model.addObject(APPLICATION, applicationForm);
                              model.setViewName(ADD_APP);


                       } else {
                              application.setErrorMessage(PropertyHandler.getPropertyInstance().getPropertyValue(Constants.ERROR_MESSAGE));
                              model.addObject(APPLICATION, application);
                              model.setViewName(ADD_APP);

                       }

                 }
                 else{
                        application.setErrorMessage(PropertyHandler.getPropertyInstance().getPropertyValue(Constants.OTHER));
                       model.addObject(APPLICATION, application);
                       model.setViewName(ADD_APP);
                 }
          }
          return model;
   }

【问题讨论】:

  • 对我来说唯一有问题的部分是:if(checkActive(application)){ status = FormBeanValidator.encodeStatus(application.getStatus());。但我看到已经有一个分离:applicationService.addApp(application) 这样可能就足够了
  • 我的问题甚至是“if”检查,即 if(checkActive(application)) 是否应该在控制器中。因为这是一个业务逻辑。
  • 嗯,这取决于checkActive 做了什么。如果它暗示了一个强大的业务逻辑,你应该把它移到服务层。

标签: java spring spring-mvc coding-style service-layer


【解决方案1】:

代码看起来不错,但我建议进行一些修改:

1) 您的checkActive(application) 似乎检查了有关您的业务对象(应用程序)的某些内容,因此将其移至服务层。您可以通过将checkActive() 方法移动到服务层并调用来合并您的checkActive() 方法逻辑它在您的applicationService.addApp(application) 中作为本地方法。

2) 您在 ifelse 块中都将视图名称设置为相同。尝试将此代码移出 if-else 块,因为它变得多余。

3) 仅将所需数据从控制器发送到视图是一种做法。这是通过创建 DTO(数据传输对象)并创建一个将您的业务对象字段映射到 DTO 的转换器类来完成的。您可以查看 DTO here 的示例用例

【讨论】:

    【解决方案2】:

    如果您在 ApplicationFormValidator 中检查 null 或不正确的格式验证,一切都很好

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 2012-11-08
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2014-02-19
      • 2017-10-19
      • 2012-01-10
      相关资源
      最近更新 更多