What is optimized way to validate mandatory fields based on other field value in Java?

I am creating a spring boot rest application where i am getting player information as JSON in a POST request to persist into database. In total, we have 16 fields but in future more fields will be added.

{     "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": ""   } 

if playerType = Batsmen, below 11 fields are mandatory, other fields specific to bowler can be null/empty.

{     "jerseyNumber": "1",     "firstName": "Sachin",     "lastName": "Tendulkar",     "age": "35",     "country": "India",     "playerType": "Batsmen",     "score": "101",     "ballsFaced": "110",     "strikeRate": "90",     "fours": "15",     "sixes": "1",   } 

if playerType = Bowler, below 11 fields are mandatory.

{     "jerseyNumber": "10",     "firstName": "Zaheer",     "lastName": "Khan",     "age": "38",     "country": "India",     "playerType": "Bowler",     "oversBowled": "10",    '     "runsGiven": "39",     "maidenOvers": "1",     "wicketsTaken": "3",     "economy": "3.9"   } 

Pojo Class

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  } 

On receiving the request, i need to perform validation based on playerType value, 1) if all the mandatory fields are given (not empty or null) in the json request.

Also below business validations needs to be checked,

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 

Going forward, the number of mandatory fields can increase to 25-30 fields. I can write the validation using if else statement based on player type value.

if(cricketPlayer.getPlayerType.equals("Batsmen") { // writelogic to check if all mandatory fields are not null or empty  } else if(cricketPlayer.getPlayerType.equals("Bowler") {   } 

But multiple if else block doesn’t look good if we have more than 20-25 mandatory fields to validate. What is the optimized and best approach to follow in this scenario so that it is more readable and easy to add or remove any validations.

Add Comment
1 Answer(s)

use a Hash-Map. use a Validator interface -> which can then have different implementations -> BatsmanValidator & BowlerValidator. You may also, abstract out the commonalities and validate them with one class like PlayerValidator.

Interface & Class

Interface Validator {   public boolean validate(Player pojo); }  class BatsmanValidator implements Validator {   public boolean validate(Player pojo) {   // code to validate a batsman    } } 

Usage

// 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); 
Answered on July 16, 2020.
Add Comment

Your Answer

By posting your answer, you agree to the privacy policy and terms of service.