Hibernate Validator vs Regex vs Handbook Validation – DZone – Uplaza

Whereas I used to be coding for a efficiency back-end competitors,  I attempted a few methods, and I used to be questioning if there was a quicker validator for Java functions, so I began a pattern utility.

I used a quite simple situation: simply validate the consumer’s e-mail.

Controller With Hibernate Validator

Hibernate Validator wants an object to place its guidelines to, so we have now this:

public document Consumer(
    @NotNull
    @Electronic mail
    String e-mail
){}

That is used within the HibernateValidatorController class, which makes use of the jakarta.validation.Validator (which is simply an interface for the Hibernate Validator implementation):

@RestController
@Validated
public class HibernateValidatorController {

    @Autowired
    non-public Validator validator;

    @GetMapping("/validate-hibernate")
    public ResponseEntity validateEmail(@RequestParam String e-mail) {

Utilizing the validate technique, we will verify if this consumer’s e-mail is legitimate and get a correct HTTP response.

var consumer = new Consumer(e-mail);
var violations = validator.validate(consumer);
if (violations.isEmpty()) {
  return ResponseEntity.okay("Valid email: 200 OK");
} else {
  var violationMessages = new StringBuilder();
  for (ConstraintViolation violation : violations) {
    violationMessages.append(violation.getMessage()).append("n");
  }
  return ResponseEntity.standing(HttpStatus.BAD_REQUEST)
     .physique("Invalid email: 400 Bad Requestn" + violationMessages.toString());
}

Controller With Common Expression

For validation with regex, we’d like simply the e-mail regex and a technique to validate:

static remaining String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@(.+)$";

boolean isValid(String e-mail) {
  return e-mail != null && e-mail.matches(EMAIL_REGEX);
}

The regexController class simply will get an e-mail from the request and makes use of the isValid technique to validate it.

@GetMapping("/validate-regex")
public ResponseEntity validateEmail(@RequestParam String e-mail) {

  if (isValid(e-mail)) {
    return ResponseEntity.okay("Valid email: 200 OK");
  } else {
    return ResponseEntity.standing(HttpStatus.BAD_REQUEST).physique("Invalid email: 400 Bad Request");
  }

}

Controller With Handbook Validation

We can’t use any framework or libs to validate, simply plain outdated String strategies:

boolean isValid(String e-mail) {
  if (e-mail == null) return false;
  int atIndex = e-mail.indexOf("@");
  int dotIndex = e-mail.lastIndexOf(".");

  return atIndex > 0 && dotIndex > atIndex + 1 && dotIndex 

The programmaticController class simply will get an e-mail from the request and makes use of the isValid technique to validate it. 

@GetMapping("/validate-programmatic")
public ResponseEntity validateEmail(@RequestParam String e-mail) {

  if (isValid(e-mail)) {
    return ResponseEntity.okay("Valid email: 200 OK");
  } else {
    return ResponseEntity.standing(HttpStatus.BAD_REQUEST).physique("Invalid email: 400 Bad Request");
  }

}

Very Easy Stress Check

We’re utilizing Apache JMeter to check all 3 APIs. 

Our simulation runs with 1000 concurrent customers in a loop for 100 occasions sending a legitimate e-mail every request.

Working it on my desktop machine obtained related outcomes for all APIs, however the winner is Hibernate Validator.

| API                            | avg | 99% | max  | TPS    |    
|--------------------------------|-----|-----|------|--------|
| Regex API Thread Group         | 18  | 86  | 254  | 17784  | 
| Programmatic API Thread Group  | 13  | 67  | 169  | 19197  |  
| Hibernate API Thread Group     | 10  | 59  | 246  | 19960  | 

Conclusion

Earlier than this check, I assumed that my very own code ought to carry out approach higher than any individual else’s code, however truly, Hibernate Validator was the most suitable choice for my check. 

You can too run this check and verify the supply code in my GitHub.

Share This Article
Leave a comment

Leave a Reply

Your email address will not be published. Required fields are marked *

Exit mobile version