Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

@Min and @Max validation is not working of hibernate validator package in spring boot

@Min and @Max validator is not working as the value is getting assigned to a static variable from the properties file. But it taking all the value and not validating.

OTPLengthAndExpiryDetail.java

package com.custom.store.sms.twillo.model;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

@Component
@Validated
public class OTPLengthAndExpiryDetail {
    
    @Min(value = 4 , message = "Value should be greater then then equal to 4")
    @Max(value = 6 , message = "Value should be less then then equal to 6")
    @NotNull(message = "It can not be null. Please provide no. in b/w 4 to 6")
    @Value("${otp.length}")
    private static Integer length;
    
    @Min(value = 20 , message = "Value should be greater then equal to 20")
    @Max(value = 180 , message = "Value should be less then equal to 180")
    @NotNull(message = "It can not be null. Please provide no. in b/w 20 to 300")
    @Value("${otp.expiryTime}")
    private static Integer expiryTime;

    public static Integer getLength() {
        return length;
    }

    public void setLength(Integer length) {
        OTPLengthAndExpiryDetail.length = length;
    }

    public static Integer getExpiryTime() {
        return expiryTime;
    }

    public void setExpiryTime(Integer expiryTime) {
        OTPLengthAndExpiryDetail.expiryTime = expiryTime;
    }
    
}

application.properties

#1. ################       DB DETAILS        ###############################
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://remotemysql.com/q5UV1n69DW?useSSL=false
spring.datasource.username=q5
spring.datasource.password=ur
############################################################################



#2. ##############     LOGGING DETAILS FOR APPLICATION     #################
spring.h2.console.enabled=true
#logging.level.org.hibernate=debug
spring.jpa.show-sql=true
############################################################################



#3.###############       TWILLO DETAILS FOR OTP      #######################
#both below twillo details can't be null                        
twilio.accountSID=AC53bec33dc8bae99f8                                     
twilio.authId=7c31ef0e28e75473
twilio.phoneNumber=16468634753                    
############################################################################



#4.###############     OTP CONFIGURATION DETAILS     #######################
#otp.length can not be null. Please provide no. in b/w 4 to 6
otp.length=4
#otp.expirytime can not be null. Please provide no. in b/w 20 to 300
otp.expiryTime=2000
otp.message=your otp is 
############################################################################

build.gradle

plugins {
    id 'org.springframework.boot' version '2.3.3.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.custom.store'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation group: "com.twilio.sdk", name: "twilio", version : "7.47.2"
    implementation('org.springframework.boot:spring-boot-starter-validation')
    runtimeOnly 'mysql:mysql-connector-java'
    compileOnly 'org.projectlombok:lombok'
    //implementation "org.hibernate:hibernate-validator:6.1.5.Final"
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

OTPProperties.java * it is the class where I am instantiating the custom Configuration*

package com.custom.store.sms.twillo.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import com.custom.store.sms.twillo.model.OTPLengthAndExpiryDetail;
import com.custom.store.sms.twillo.model.TwilioAccountAndAuthDetail;


@Component
@ConfigurationProperties
@PropertySource("classpath:application.properties")
public class OTPProperties {
    
    //@Autowired
    TwilioAccountAndAuthDetail twilio;
    
    //@Autowired
    OTPLengthAndExpiryDetail otp;

    public TwilioAccountAndAuthDetail getTwilio() {
        return twilio;
    }

    public void setTwilio(TwilioAccountAndAuthDetail twilio) {
        this.twilio = twilio;
    }

    public OTPLengthAndExpiryDetail getOtp() {
        return otp;
    }

    public void setOtp(OTPLengthAndExpiryDetail otp) {
        this.otp = otp;
    }
    
}

like image 342
Raghawendra singh Avatar asked Aug 31 '20 20:08

Raghawendra singh


People also ask

What is the difference between javax validation and Hibernate Validator?

The Javax bean validation API provides the following most frequently used annotations. The Hibernate validator provides the following commonly used annotations for validation. In case of product or project development we must use both the annotations for bean validation.

How does Hibernate Validator work?

Hibernate Validator allows to express and validate application constraints. The default metadata source are annotations, with the ability to override and extend through the use of XML. It is not tied to a specific application tier or programming model and is available for both server and client application programming.


1 Answers

According to chapter 3 section 1 of JSR-303:

Static fields and static methods are excluded from validation.

Therefore, length and expiryTime should not be designated as static fields if you wish to apply validation to them.

like image 116
Philip Wrage Avatar answered Nov 04 '22 08:11

Philip Wrage