我正在使用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;
}
答案 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";
}
}
我需要在保存处所之前检查重复的处所名称。
如果您的业务逻辑不允许在房屋名称中使用重复项,那么在将这些名称传递到业务层之前,您一定要检查控制器中的重复项。
业务层中的异常用于表示编码器的错误,而不是用户的错误。偶尔输入两次相同的名字是用户的错误。