7

我正在尋找一種方法來驗證Spring命令bean中的java.lang.Double字段的最大值和最小值(值必須位於給定的值範圍之間),就像,使用Hibernate Validator驗證double和float值 - bean驗證

public final class WeightBean 
{ 
    @Max(groups={ValidationGroup.class}, value=Double.MAX_VALUE, message="some key or default message") 
    @Min(groups={ValidationGroup.class}, value=1D, message="some key or default message") 
    private Double txtWeight; //Getter and setter. 

    public interface ValidationGroup{}   
} 

但兩者@Max@Min不能採取一個java.lang.Double值。

注意,雙和浮動不支持,由於舍入誤差 (有些供應商可能提供一些近似支持)

那麼,什麼是驗證等領域的方式是什麼?

我正在使用Spring 3.2.0和Hibernate Validator 4.3.1 CR1。

+0

如果你想我可以在我的收藏約束在這裏實現DoubleRangeValidator:http://waxolunist.github.com/validationconstraints/ - 只要打開一個問題,明天就可以在Maven中心進行。 – Christian 2013-03-20 15:03:05

+0

@ Waxolunist - 謝謝,但我沒有得到。 – Tiny 2013-03-21 11:36:25

回答

7

您可以使用註釋,但您可能會得到錯誤的結果。在許多情況下,這是一個普遍的問題,應該避免double_s和imo。也許切換到不同的類型是最好的解決方案?例如BigDecimal

+1

我已經切換到'BigDecimal'類型,但'@ Max'和'@ Min'的'value'屬性只接受'Long'值。我需要檢查,如果一個值在一個定義的範圍之間。例如,從0.1開始到0.9。這對於bean驗證不可行嗎? – Tiny 2013-03-23 10:53:11

+4

對於'BigDecimal'請參閱'@ DecimalMin'註釋。 – 2015-09-19 11:48:11

3

我已經避免了doublefloat類型,並實現了一個自定義驗證程序,該驗證程序可以驗證基於精度和比例的BigDecimal值。

約束描述符。

package constraintdescriptor; 

import constraintvalidator.BigDecimalRangeValidator; 
import java.lang.annotation.Documented; 
import static java.lang.annotation.ElementType.ANNOTATION_TYPE; 
import static java.lang.annotation.ElementType.FIELD; 
import static java.lang.annotation.ElementType.METHOD; 
import java.lang.annotation.Retention; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 
import java.lang.annotation.Target; 
import javax.validation.Constraint; 
import javax.validation.Payload; 

@Target({METHOD, FIELD, ANNOTATION_TYPE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = BigDecimalRangeValidator.class) 
@Documented 
public @interface BigDecimalRange { 
    public String message() default "{java.math.BigDecimal.range.error}"; 
    public Class<?>[] groups() default {}; 
    public Class<? extends Payload>[] payload() default {}; 

    long minPrecision() default Long.MIN_VALUE; 
    long maxPrecision() default Long.MAX_VALUE; 
    int scale() default 0; 
} 

約束驗證。

package constraintvalidator; 

import constraintdescriptor.BigDecimalRange; 
import java.math.BigDecimal; 
import javax.validation.ConstraintValidator; 
import javax.validation.ConstraintValidatorContext; 

public final class BigDecimalRangeValidator implements ConstraintValidator<BigDecimalRange, Object> { 

    private long maxPrecision; 
    private long minPrecision; 
    private int scale; 

    @Override 
    public void initialize(final BigDecimalRange bigDecimalRange) { 
     maxPrecision = bigDecimalRange.maxPrecision(); 
     minPrecision = bigDecimalRange.minPrecision(); 
     scale = bigDecimalRange.scale(); 
    } 

    @Override 
    public boolean isValid(final Object object, final ConstraintValidatorContext cvc) { 
     boolean isValid = false; 

     if (object == null) { // This should be validated by the not null validator (@NotNull). 
      isValid = true; 
     } else if (object instanceof BigDecimal) { 
      BigDecimal bigDecimal = new BigDecimal(object.toString()); 
      int actualPrecision = bigDecimal.precision(); 
      int actualScale = bigDecimal.scale(); 
      isValid = actualPrecision >= minPrecision && actualPrecision <= maxPrecision && actualScale <= scale; 

      if (!isValid) { 
       cvc.disableDefaultConstraintViolation(); 
       cvc.buildConstraintViolationWithTemplate("Precision expected (minimun : " + minPrecision + ", maximum : " + maxPrecision + "). Maximum scale expected : " + scale + ". Found precision : " + actualPrecision + ", scale : " + actualScale).addConstraintViolation(); 
      } 
     } 

     return isValid; 
    } 
} 

這可以擴展爲其他類型,以及在需要時。


終於在豆,類型BigDecimal的財產可以由@BigDecimalRange註釋如下註解。

package validatorbeans; 

public final class WeightBean { 

    @BigDecimalRange(minPrecision = 1, maxPrecision = 33, scale = 2, groups = {ValidationGroup.class}, message = "The precision and the scale should be less than or equal to 35 and 2 respectively.") 
    private BigDecimal txtWeight; // Getter and setter. 

    public interface ValidationGroup {} 
} 
0

您也可以使用從Hibernate驗證API @Digits以及

@Digits(integer = 10 /*precision*/, fraction = 2 /*scale*/)