package org.jooby.hbv;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.stream.Collectors;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Path;
import org.jooby.Parser;
import org.jooby.hbm.data.Car;
import org.jooby.json.Jackson;
import org.jooby.test.ServerFeature;
import org.junit.Test;
public class BeanValidationFeature extends ServerFeature {
{
parser(Parser.bean(true));
use(new Jackson());
use(new Hbv(Car.class));
err((req, rsp, err) -> {
Throwable cause = err.getCause();
if (cause instanceof ConstraintViolationException) {
Set<ConstraintViolation<?>> constraints = ((ConstraintViolationException) cause)
.getConstraintViolations();
Map<Path, String> errors = constraints.stream()
.collect(
Collectors.toMap(
ConstraintViolation::getPropertyPath,
ConstraintViolation::getMessage
)
);
TreeMap<Path, String> sortedMap = new TreeMap<>((o1, o2) -> {
return o1.toString().compareTo(o2.toString());
});
sortedMap.putAll(errors);
rsp.send(sortedMap);
}
});
get("/validate", req -> {
Car car = req.params().to(Car.class);
return car;
});
}
@Test
public void validate() throws Exception {
request()
.get("/validate?manufacturer=&licencePlate=DD-AB-123&seatCount=1")
.expect(400)
.expect("{\"manufacturer\":\"may not be empty\",\"seatCount\":\"must be greater than or equal to 2\"}");
}
}