Giter Site home page Giter Site logo

microtweak / conditional-validator Goto Github PK

View Code? Open in Web Editor NEW
6.0 2.0 1.0 255 KB

An extension package for Bean Validation 2.0 that adds conditional validations

License: MIT License

Java 100.00%
bean-validation hibernate-validator apache-bval conditional

conditional-validator's Introduction

Conditional Validator

Problem

The constraints of the Bean Validation cannot be turned on/off programmatically or according to any condition of the model object.

The @GroupSequenceProvider annotation from Hibernate Validator (RI) allows you to emulate this feature, however, it is a bit boring and tiring implement a class for each validated model object.

Solution

An extension for Bean Validation 2.0 containing analogous annotations for each constraint. For example, if you want to apply @NotNull conditionally use @NotNullWhen(expression = "")

Currently, the constraint expression is provided by Commons Jexl. All provided expression must return a Boolean (true/false).

Whenever the expression returns true, Conditional Validator delegates to the provider (Hibernate Validator or Apache BVal) the corresponding validation. For example, when the @NotNulWhen expression is true, ConditionalValidator tells the provider to validate as @NotNull.

Usage

  1. Add dependency to pom.xml
<!-- If you use Hibernate Validator (RI) -->
<dependency>
    <groupId>com.github.microtweak</groupId>
    <artifactId>conditional-validator-hv</artifactId>
    <version>${conditional-validator.version}</version>
</dependency>

<!-- If you use Apache BVal -->
<dependency>
    <groupId>com.github.microtweak</groupId>
    <artifactId>conditional-validator-bval</artifactId>
    <version>${conditional-validator.version}</version>
</dependency>
  1. Add annotations Conditional Validator
@ConditionalValidate // Enable conditional validation on this class
public class User {

    private boolean notifyByEmail;

    @EmailWhen(expression = "notifyByEmail") // Add the conditional constraint and set the expression
    private String email;
    
    // Getters and Setters
}

conditional-validator's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

jacksonpscruz

conditional-validator's Issues

Plans to migrate/support to bean validation 3 / jakarta namespace?

Hi,

I've recently migrated a spring boot 2.7 project to spring boot 3. I was using the conditional validator in the project and that has stopped working. Spring boot 3 uses Hibernate 6.1 which uses version 3 of the validation api.

Are there any plans to migrate this to support the new jakarta namespace / bean validation 3?

Class not found ConstraintLocation$ConstraintLocationKind when using hibernate-validator 6.0.23.Final

due to HibernateValidatorConstraintDescriptorFactory, and new 6.0.x versions of hibernate-validator, there is a class not found : ConstraintLocation$ConstraintLocationKind.

The code is as follow, and doesn't take into account versions > 6.0.20 of 6.0.x versions:

if (version.gt("6.0.20")) {
            this.strategy = new Hv61XConstraintDescriptorImplStrategy();
        } else {
            if (!version.ge("6.0.6") || !version.le("6.0.20")) {
                throw new IllegalStateException("Hibernate Validator older then 6.0.6 is not supported");
            }

            this.strategy = new Hv60XConstraintDescriptorImplStrategy();
        }

usage of Hv61XConstraintDescriptorImplStrategy should be tested upon 6.1.x versions and usage of Hv60XConstraintDescriptorImplStrategy should be tested upon 6.0.x versions to avoid this kind of problems.

pseudo-code proposal:

if (version >= 6.1.x) { use 61XConstraintDescriptorImplStrategy }
else if (version >= 6.0.6) { use Hv60XConstraintDescriptorImplStrategy }
else {
throw throw new IllegalStateException("Hibernate Validator older than 6.0.6 is not supported");
}

see https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator

Add support for other Annotation Targets

Implement support for the following targets:

  • TYPE
  • CONSTRUCTOR
  • METHOD
  • PARAMETER

Add conditional constraint to annotations:

  • org.hibernate.validator.constraints.ParameterScriptAssert
  • org.hibernate.validator.constraints.ScriptAssert

@NullWhen throwing Unexpected exception during isValid call

Hello,

I'm trying to use the @NullWhen annotation but I'm getting an jakarta.validation.ValidationException: HV000028: Unexpected exception during isValid call.

I'm using conditional-validator-hv:2.0.0-rc on Quarkus 3.2.0.Final, Hibernate Validator 8.0.1.Final and Jakarta Validation 3.0.2 on Java 17.

It appears that this annotation is having trouble calling the @null initialize method. Or it could be another problem, I don't know for sure. Could you investigate this for me?

At my DTO class I'm using the @NullWhen annotation as follows:

@ConditionalValidate
public class UpdateDTO {

	private boolean onlySomethingAllowed;

        @NullWhen(expression = "onlySomethingAllowed", message = "someField must be null when other field is present")
        private String someField;

        // Setter of someField that sets onlySomethingAllowed to true given specific value
}

Attached is the stack trace of the exception.

Regards,
Paulo

StackTrace.txt

Support of @ValidWhen annotation

Hello,

First of all thanks for the initiative with this project! It's clearly useful for corner cases not supported (at least yet) by Beans Validator API.

Unfortunately, I don't see any way to use "@ValidWhen" logic. Is it a limitation of the solution? Otherwise, would it be possible to add it?

I would be happy to help you with this new change if necessary

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.