Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中基于其他字段值验证必填字段的优化方法是什么?_Java_Spring_Spring Boot_Validation_Design Patterns - Fatal编程技术网

Java中基于其他字段值验证必填字段的优化方法是什么?

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&

我正在创建一个SpringBootREST应用程序,在该应用程序中,我将在POST请求中以JSON的形式获取播放器信息,以持久保存到数据库中。我们总共有16个字段,但将来将添加更多字段

{
    "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);