🐛 Bug Report: Hibernate Validator Not Working in Script/Lambda Mode (BeanValidator.validate(...))
Version: Jooby 4.0.4
Mode: Script/Lambda (extends Jooby)
Modules Used:
✅ Expected Behavior
Using the documented method:
post("/v1", BeanValidator.validate(ctx -> {
UserDto userDto = ctx.body(UserDto.class);
...
}));
should automatically validate the UserDto object using
jakarta.validation annotations, e.g., @notblank, and return validation
errors only if fields are invalid.
❌ Actual Behavior
Even when all required fields are provided and valid, the validator
returns errors like:
{
"title": "Validation failed",
"status": 422,
"errors": [
{
"field": "password",
"messages": ["password can not empty"],
"type": "FIELD"
},
{
"field": "username",
"messages": ["username can not empty"],
"type": "FIELD"
}
]
}
This does not happen if I manually validate the object.
🧪 Reproduction
-
DTO Class
package app.domain.user;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@DaTa
public class UserDto {
@notblank(message = "username can not empty")
private String username;
@NotBlank(message = "password can not empty")
private String password;
}
-
❌ Failing Handler Using BeanValidator.validate(...)
post("/v1", BeanValidator.validate(ctx -> {
UserDto userDto = ctx.body(UserDto.class);
...
}));
-
✅ Working Handler Using Manual Validation
post("/v2", ctx -> {
UserDto userDto = ctx.body(UserDto.class);
Validator validator = require(Validator.class);
Set<ConstraintViolation<UserDto>> violations = validator.validate(userDto);
if (!violations.isEmpty()) {
for (ConstraintViolation<UserDto> v : violations) {
throw new StatusCodeException(StatusCode.BAD_REQUEST, v.getPropertyPath() + " " + v.getMessage());
}
}
...
});
✅ Conclusion
- Validation annotations work correctly with manual validation
- But fail incorrectly using the documented
BeanValidator.validate(...) approach in script/lambda mode
- This appears to be a bug specific to jooby-hibernate-validator
integration in non-MVC mode
🐛 Bug Report: Hibernate Validator Not Working in Script/Lambda Mode (BeanValidator.validate(...))
Version: Jooby 4.0.4
Mode: Script/Lambda (extends Jooby)
Modules Used:
Reference:
https://jooby.io/modules/hibernate-validator/#hibernate-validator-hibernate-integration
✅ Expected Behavior
Using the documented method:
should automatically validate the UserDto object using
jakarta.validation annotations, e.g., @notblank, and return validation
errors only if fields are invalid.
❌ Actual Behavior
Even when all required fields are provided and valid, the validator
returns errors like:
This does not happen if I manually validate the object.
🧪 Reproduction
DTO Class
package app.domain.user;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@DaTa
public class UserDto {
@notblank(message = "username can not empty")
private String username;
}
❌ Failing Handler Using BeanValidator.validate(...)
post("/v1", BeanValidator.validate(ctx -> {
UserDto userDto = ctx.body(UserDto.class);
...
}));
✅ Working Handler Using Manual Validation
post("/v2", ctx -> {
UserDto userDto = ctx.body(UserDto.class);
});
✅ Conclusion
BeanValidator.validate(...) approach in script/lambda mode
integration in non-MVC mode