我应该把我的业务不变检查控制器

时间:2016-01-25 04:07:29

标签: java spring spring-mvc

我正在使用Spring MVC。我需要在保存前提之前检查重复的premises name。 在控制器

public void savePremises() {
    // Check duplicate 
    Set<String> premiseNames = new HashSet<String>();
    //premises is global variable which contain the list of premises to save
    for (Premise premise : premises) {
        String premiseName = premise.getPremiseName();
        if (premiseNames.contains(premiseName)) {
            Clients.showNotification("Duplicated primise name "
                    + premiseName);
            return;
        } else {
            premiseNames.add(premiseName);
        }
    }
..............
}

因为我将这个检查代码用于另一个控制器中的前提,所以我想把它放在服务类中以便以后重用。
然后我需要从服务函数返回2个值:
+一个布尔值,表示检查结果。
+重复的前提名称的字符串值。
我有一个解决方案,返回前提名称的空值,表示没有重复的前提名称。这样做是不好的做法?
在控制器中

public void savePremises(){
    String premiseName =premiseService.isDuplicatedPremiseName(premises);
    if( premiseName!=null) {
        Clients.showNotification("Duplicated primise name "
                + premiseName);
        return;
    }
}

在服务中

public String isDuplicatedPremiseName(List<Premise> premises) {
   Set<String> premiseNames = new HashSet<String>();
   for (Premise premise : premises) {
    String premiseName = premise.getPremiseName();
    if (premiseNames.contains(premiseName)) {
        return premiseName;
    } else {
        premiseNames.add(premiseName);
    }
   }
   return null;
}

2 个答案:

答案 0 :(得分:2)

理想情况下,Spring MVC控制器应该是从服务逻辑到HTTP(HTML或JSON / XML REST API)的非常精简的适配器。除了基本的DTO验证之外,业务逻辑应该包含在您的服务类中。这使得业务逻辑更容易测试并且更易于重用(例如,在呈现HTML和JSON的控制器之间)。

在您的情况下,除非用户主动期望搜索重复项(可能在搜索公共记录中),否则最好不要显式调用检查程序。业务逻辑应负责确保保留不变量,否则抛出异常。您可以在控制器中捕获异常(通常是HTML控制器的情况)或使用Spring HTTP注释对其进行注释并允许它传播(通常是JSON控制器的情况)。

答案 1 :(得分:1)

  

我有一个解决方案,为前提名称返回空值,表示没有重复的前提名称。这样做是不好的做法吗?

是的,返回null肯定是不好的做法。

相反,您可以使用包含值的Optional<T>类或包含值不可用的指示。

events: {
    drilldown: function (e) {
        alert('Drill Down');
        document.getElementById('Account 1').style.display = "block";
        document.getElementById('AccountGeneral').style.display = "none";
    },
    drillup: function (e) {
        alert('Drill Up');
        document.getElementById('Account 1').style.display = "none";
        document.getElementById('AccountGeneral').style.display = "block";
    }
}
  

我需要在保存处所之前检查重复的处所名称。

如果您的业务逻辑不允许在房屋名称中使用重复项,那么在将这些名称传递到业务层之前,您一定要检查控制器中的重复项。

业务层中的异常用于表示编码器的错误,而不是用户的错误。偶尔输入两次相同的名字是用户的错误。