Skip to content

Bug Report: Hibernate Validator Not Working in Script/Lambda Mode (BeanValidator.validate(...))Β #3751

@kangmind

Description

@kangmind

πŸ› 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

  1. 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;
    

    }

  2. ❌ Failing Handler Using BeanValidator.validate(...)

    post("/v1", BeanValidator.validate(ctx -> {
    UserDto userDto = ctx.body(UserDto.class);
    ...
    }));

  3. βœ… 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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions