7

Springコマンドbeanのjava.lang.Doubleフィールドの最大値と最小値を検証する方法を探しています(値は指定された値の範囲内にある必要があります) 、Hibernate Validator - Beanの検証を使用してdouble値とfloat値を検証する

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

@Digitsを使用することができます。http://waxolunist.github.com/validationconstraints/ - 問題を開くだけで、明日はMavenの中心に置くことができます。 – Christian

+0

@ Waxolunist - ありがとうが、私は得られなかった。 – Tiny

答えて

7

注釈を使用することはできますが、それに応じて偽の結果が表示されることがあります。これはダブルスとイモの一般的な問題です。多くの場合、_Double_sは避けるべきです。多分、別のタイプに切り替えるのが最良の解決策ですか?例えば、BigDecimal

+1

私は 'BigDecimal'型に切り替えましたが、' @ Max'と '@ Min'の' value'属性は 'Long'値しか受け付けません。値が定義された範囲内にあるかどうかを確認する必要があります。例えば、0.1から0.9で開始する。これはBeanの検証では不可能ですか? – Tiny

+4

'BigDecimal'は' @ DecimalMin'アノテーションを参照してください。 –

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

制約バリデータ。

これは、必要に応じて他のタイプにも拡張できます。 Bean内の


そして最後に、次のように、タイプ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 {} 
} 
4

あなたがBigDecimalの(またはのBigInteger)に切り替えた場合は、@DecimalMin@DecimalMaxを使用することができます。 しかし、これはまだフロートまたはダブルのための解決策です。

0

あなたは私がここで制約の私のコレクションにDoubleRangeValidatorを実装することができますしたい場合にも、

にもHibernateのバリデータAPIから
@Digits(integer = 10 /*precision*/, fraction = 2 /*scale*/) 
関連する問題