【问题标题】:How to reduce a null validation code with java 8 and springjpa?如何使用 java 8 和 spring jpa 减少空验证码?
【发布时间】:2019-12-14 15:07:43
【问题描述】:

我想减少验证,也许使用一些方法。

我正在处理一个基本的问题,在更新端点上,他们想一次只更新一个字段,并给我任意数量的参数,可以是 1,2 或 10。他们不想要如果没有发送参数,当然要清除数据库。

 @PostMapping("/updateTask")
    @ResponseBody
    public String updateTask(@RequestBody Task sentTask) {

        Task dbTask = null;

        try {
            dbTask = taskDao.findByIdTask(sentTask.getIdTask());

           if(isValid(sentTask.getAuthor())){
                dbTask.setAuthor(sentTask.getAuthor());
            }
            else{
                dbTask.setAuthor(dbTask.getAuthor());
            }

            if(isValid(sentTask.getIdReport())){
                dbTask.setIdReport(sentTask.getIdReport());
            }
            else{
                dbTask.setIdReport(dbTask.getIdReport());
            }
                taskDao.save(dbTask);
        } catch (Exception e) {
            String response = "{\"data\": 
    {\"success\":\"false\",\"error\":\"Error updating the task:\"}}";
            return response;
        }
        String response = "{\"data\":{\"success\":\"true\",\"message\":\"Task 
      updated successfully\",\"Id\":\"" + sentTask.getIdTask() + "\"}}\n";
        return response;
      }


    public boolean isValid(Object data){
        if (data == null){
            return false;
        }

        if(data.equals("")){
            return false;
        }

        return true;

    }

我想要这样的

   public void setData(Object sentData, Object dbData){
        if (isValid(sentData)){
            dbData.setSentData
        }
        else{
            dbData.setDbData
        }
     }

【问题讨论】:

    标签: java mysql rest spring-data-jpa


    【解决方案1】:

    可以考虑使用java 8中提供的Optional

    Optional<String> authorOptional = Optional.ofNullable(sentTask.getAuthor());
    if(authorOptional.isPresent()){
        dbTask.setAuthor(sentTask.getAuthor());
    }else{
        dbTask.setAuthor(dbTask.getAuthor());
    }
    
    Optional<String> reportOptional = Optional.ofNullable(sentTask.getIdReport());
    if(reportOptional.isPresent()){
        dbTask.setIdReport(sentTask.getIdReport());
    }else{
        dbTask.setIdReport(dbTask.getIdReport());
    }
    

    dbTask.setAuthor(Optional.ofNullable(sentTask.getAuthor()).isPresent()?sentTask.getAuthor():dbTask.getAuthor());
    
    dbTask.setIdReport(Optional.ofNullable(sentTask.getIdReport()).isPresent()?sentTask.getIdReport():dbTask.getIdReport());
    

    现在你不需要 isValid 或 setData 方法

    我建议业务逻辑相关的更改应该由服务层处理

    【讨论】:

      【解决方案2】:

      1) 首先是这样的代码

      else {
          dbTask.setIdReport(dbTask.getIdReport());
      }
      

      只要属性值保持不变就没有任何意义。所以我们可以很容易地把它扔掉。

      2) 通过以下方法可以实现一些减少

      添加以下方法:

      public void updateTask(Task received, Task existing) {
          // run validations and copy only valid values
          copyValid(received::getAuthor, existing::setAuthor);
          copyValid(received::getReportId, existing::setReportId);
      
          taskDao.save(existing);
      }
      
      private <T> void copyValid(Supplier<T> getter, Consumer<T> setter) {
          Optional.ofNullable(getter.get())
                  .map(this::validOrNull) 
                  .ifPresent(setter); // setter will be executed only for non-null values
      }
      
      private <T> T validOrNull(T data) {
          if (data == null) {
              return null;
          }
          if (data instanceof String && data.equals("")) {
              return null; // if data is invalid return null 
          }
          // additional checks for other types can be added here
          return data; // otherwise return data as is
      }
      

      并像这样调整控制器方法

      @PostMapping("/updateTask")
      @ResponseBody
      public String updateTask(@RequestBody Task sentTask) {
          try {
              Task dbTask = taskDao.findByIdTask(sentTask.getIdTask());
              updateTask(sentTask, dbTask);
          } catch (Exception e) {
              // omitted
          }
      }
      

      附:正如另一个答案中已经提到的,您应该将业务逻辑提取到单独的服务中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-12
        • 1970-01-01
        • 2018-02-12
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 2016-11-27
        • 1970-01-01
        相关资源
        最近更新 更多