In this tutorial we will see how to perform JSR 349/303 annotation based validation in a Spring application.
Please check out our Java EE Bean Validation tutorials if not already familiar with it.
The Spring specific class LocalValidatorFactoryBean implements javax.validation.Validator , javax.validation.ValidatorFactory and org.springframework.validation.Validator interfaces. This class wraps standard JSR 349/303 bean validation bootstrapping process and also wraps the access around org.springframework.validation.Validator . LocalValidatorFactoryBean allows as to inject javax.validation.Validator . We can also inject org.springframework.validation.Validator instead of javax.validation.Validator and then in that case we will be using Spring validation API to perform validation.
Example
A bean using validation annotations
package com.logicbig.example;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Future;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
public class Order {
@NotNull(message = "{date.empty}")
@Future(message = "{date.future}")
private Date date;
@NotNull(message = "{price.empty}")
@DecimalMin(value = "0", inclusive = false, message = "{price.invalid}")
private BigDecimal price;
.............
}
Spring configuration
package com.logicbig.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import javax.validation.Validator;
@Configuration
public class Config {
@Bean
public ClientBean clientBean() {
return new ClientBean();
}
@Bean
public Validator validatorFactory() {
return new LocalValidatorFactoryBean();
}
}
Performing Validation
package com.logicbig.example;
import org.springframework.beans.factory.annotation.Autowired;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.util.Comparator;
import java.util.Locale;
import java.util.Set;
public class ClientBean {
@Autowired
Validator validator;
public void processOrder(Order order) {
if (validateOrder(order)) {
System.out.println("processing " + order);
}
}
private boolean validateOrder(Order order) {
Locale.setDefault(Locale.US);
Set<ConstraintViolation<Order>> c = validator.validate(order);
if (c.size() > 0) {
System.err.println("Order validation errors:");
c.stream().sorted(Comparator.comparing(v->v.getPropertyPath().toString()))
.map(v -> v.getMessage()).forEach(System.err::println);
return false;
}
return true;
}
}
Main class
package com.logicbig.example;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Calendar;
public class ValidationJSR349Example {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(Config.class);
Order order = new Order();
//order.setPrice(BigDecimal.TEN);
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(2021,1,1, 0,0,0);
order.setDate(calendar.getTime());
ClientBean bean = context.getBean(ClientBean.class);
bean.processOrder(order);
}
}
OutputOrder validation errors: {date.future} {price.empty}
Example ProjectDependencies and Technologies Used: - spring-context 5.3.23 (Spring Context)
Version Compatibility: 3.2.3.RELEASE - 5.3.23
- hibernate-validator 6.2.3.Final (Hibernate Validator Engine - Relocation Artifact)
- javax.el-api 3.0.0 (Expression Language 3.0 API)
- javax.el 2.2.6 (Expression Language 2.2 Implementation)
- JDK 8
- Maven 3.8.1
|