7

En yüksek ve en düşük değerler için bir komut satırı java.lang.Double alanını doğrulamak için bir yöntem arıyorum (bir değer verilen değerler aralığı arasında olmalıdır) ,Hibernate Validator - bean validation kullanarak çift ve yüzdürme değerlerini doğrulama

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

Ama her ikisi @Max ve @Min bir java.lang.Double değer alamaz. çift ​​ve şamandıra nedeniyle Yani böyle alanları doğrulayarak yolu nedir

olduğunu (bazı tahmini destek sağlamak olabilecek bazı sağlayıcılar) hataları yuvarlama için desteklenmeyen

Not?

Spring 3.2.0 ve Hibernate Validator 4.3.1 CR1 ile çalışıyorum.

+0

Ona, burada kısıtlamaları koleksiyonumda bir DoubleRangeValidator uygulayabilirsiniz isterseniz kullanabilirsiniz: http://waxolunist.github.com/validationconstraints/ - Sadece bir sorun açın, yarın maven merkezde olabilir. – Christian

+0

@ Waxolunist - Teşekkürler ama almadım. – Tiny

cevap

7

Ek açıklamaları kullanabilirsiniz, ancak bağlı olarak yanlış sonuçlar alabilirsiniz. Bu, çiftler ve imo'lar ile genel bir problemdir, birçok durumda _Double_s kaçınılmalıdır. Belki farklı bir türe geçmek en iyi çözümdür? Örneğin BigDecimal?

+1

'BigDecimal' türüne geçtim ama' Max' ve '@ Min'' 'value' özniteliği sadece' Long' değerini kabul eder. Tanımlanmış bir aralık arasında bir değer olup olmadığını kontrol etmem gerekiyor. Örneğin, 0,1'den 0,9'a kadar. Fasulye validasyonu ile bu mümkün değil mi? – Tiny

+4

'BigDecimal' için' @ DecimalMin' ek açıklama bakın. –

3

double ve float türlerinden kaçındım ve BigDecimal değerini kesinlik ve ölçek temelinde doğrulayabilen bir özel doğrulayıcı uyguladı.

Kısıtlayıcı tanımlayıcısı.

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

kısıt doğrulayıcı.

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

Bu, diğer türlerde olduğu gibi, gerektiğinde de genişletilebilir. aşağıdaki gibi


Ve nihayet fasulye

, tip BigDecimal malı @BigDecimalRange açıklama ile açıklamalı olabilir. Eğer BigDecimal (veya BigInteger) geçtiyseniz

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

Ayrıca hazırda doğrulayıcı API @Digits yanı

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