Java中基于其他字段值验证必填字段的优化方法是什么?
我正在创建一个SpringBootREST应用程序,在该应用程序中,我将在POST请求中以JSON的形式获取播放器信息,以持久保存到数据库中。我们总共有16个字段,但将来将添加更多字段Java中基于其他字段值验证必填字段的优化方法是什么?,java,spring,spring-boot,validation,design-patterns,Java,Spring,Spring Boot,Validation,Design Patterns,我正在创建一个SpringBootREST应用程序,在该应用程序中,我将在POST请求中以JSON的形式获取播放器信息,以持久保存到数据库中。我们总共有16个字段,但将来将添加更多字段 { "jerseyNumber": "1", "firstName": "Sachin", "lastName": "Tendulkar", "age&
{
"jerseyNumber": "1",
"firstName": "Sachin",
"lastName": "Tendulkar",
"age": "35",
"country": "India",
"playerType": "Batsmen",
"score": "101",
"ballsFaced": "110",
"strikeRate": "90",
"fours": "15",
"sixes": "1",
"oversBowled": "", '
"runsGiven": "",
"maidenOvers": "",
"wicketsTaken": "",
"economy": ""
}
如果playerType=击球手,则必须输入以下11个字段,其他特定于投球手的字段可以为空/空
{
"jerseyNumber": "1",
"firstName": "Sachin",
"lastName": "Tendulkar",
"age": "35",
"country": "India",
"playerType": "Batsmen",
"score": "101",
"ballsFaced": "110",
"strikeRate": "90",
"fours": "15",
"sixes": "1",
}
如果playerType=Bowler,则以下11个字段为必填字段
{
"jerseyNumber": "10",
"firstName": "Zaheer",
"lastName": "Khan",
"age": "38",
"country": "India",
"playerType": "Bowler",
"oversBowled": "10", '
"runsGiven": "39",
"maidenOvers": "1",
"wicketsTaken": "3",
"economy": "3.9"
}
波乔班
public class CricketPlayer {
private String jerseyNumber;
private String firstName;
private String lastName;
private String age;
private String country;
private String playerType;
private String score;
private String ballsFaced;
private String strikeRate;
private String fours;
private String sixes;
private String oversBowled;
private String runsGiven;
private String maidenOvers;
private String wicketsTaken;
private String economy;
// Getter Methods
}
在收到请求时,如果json请求中给出了所有必填字段(非空或null),我需要根据playerType值1)执行验证
下面还需要检查业务验证
a) age => 18 and age <= 50
b) country is any value from (England, Australia, India, Srilanka, New Zealand, South Africa, Pakistan, Zimbabwe, West Indies, Bangladesh)
c) maidenOvers < oversBowled
d) wicketsTaken < 11
e) ballsfaced < =360
f) oversBowled <= 10
但是,如果要验证的必填字段超过20-25个,则多个if-else块看起来不太好。在这种情况下,最佳的优化方法是什么,以便更具可读性,更容易添加或删除任何验证。使用
哈希映射。使用Validator
接口->它可以有不同的实现->BatsmanValidator
&BowlerValidator
。您还可以抽象出共性,并使用一个类(如PlayerValidator
)对其进行验证
接口与类
用法
//安装验证程序
//此外,播放器类型应作为枚举输入。
Map validators=newhashmap();
验证器。put(蝙蝠侠,新的蝙蝠侠验证器());
验证器.put(Bowler,new BowlerValidator());
//验证输入
//这将根据类型本身验证播放器
//没有,如果需要的话
get(player.getType()).validate(player);
看起来设计从一开始就是错误的。阅读关注点分离。@AbhirojPanwar:因为投球手也可以击球,反之亦然,所以我在同一个json中选择了所有字段。在我看来,其他字段可以被指定为默认值进行验证。如果使用spring引导,那么JSON中的可选性将在编译时确定。你可以根据专业化来划分一个玩家,并将其暴露在另一个rest端点上,这取决于你,如果有任何一天有其他错误的话。相反,使用一个散列映射
:仍然在单独的验证器验证方法中,我必须编写多个if-else语句来检查是否给出了必需的字段值。假设,我还必须添加业务验证,如年龄>0和年龄<100,国家值是有效的国家名称,wicketsTaken u必须使用if-else某处进行比较。这避免了在单个函数中进行比较的混乱。
if(cricketPlayer.getPlayerType.equals("Batsmen")
{
// writelogic to check if all mandatory fields are not null or empty
} else if(cricketPlayer.getPlayerType.equals("Bowler")
{
}
Interface Validator {
public boolean validate(Player pojo);
}
class BatsmanValidator implements Validator {
public boolean validate(Player pojo) {
// code to validate a batsman
}
}
// setup validator
// Also, the player type should go in as enum.
Map<PlayerType, Validator> validators = new HashMap<>();
validators.put(Batsman, new BatsmanValidator());
validator.put(Bowler, new BowlerValidator());
// validate input
// This will itself validate the player based on type
// no if-else needed
validators.get(player.getType()).validate(player);