【问题标题】:@Min and @Max validation is not working of hibernate validator package in spring boot@Min 和 @Max 验证不适用于 Spring Boot 中的休眠验证器包
【发布时间】:2020-12-19 23:47:27
【问题描述】:

@Min 和 @Max 验证器无法正常工作,因为值正在从属性文件分配给静态变量。但它获取了所有的价值并且没有验证。

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 * 这是我实例化自定义配置的类*

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;
    }
    
}

【问题讨论】:

    标签: java spring spring-boot hibernate spring-mvc


    【解决方案1】:

    根据JSR-303的第3章第1节:

    静态字段和静态方法被排除在验证之外。

    因此,如果您希望对其应用验证,则不应将 lengthexpiryTime 指定为 static 字段。

    【讨论】:

    • 有什么方法可以验证静态变量吗?
    • 这两个变量都是常量,并且在类初始化时加载一次。它应该是静态的。有什么方法可以验证静态字段吗?
    • @Raghawendrasingh 那么为什么不将它们设为最终实例字段呢?
    • 我在静态块中使用这两个变量。而在静态块内,只能使用静态变量。这就是为什么将其设置为最终版本是行不通的。
    • 谢谢,@PhilipWrage 它通过制作最终实例字段来工作。
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多