13

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

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

丸め誤差のため、double と float はサポートされていないことに注意してください (一部のプロバイダーは近似サポートを提供する場合があります)。

では、そのようなフィールドを検証する方法は何ですか?

Spring 3.2.0 と Hibernate Validator 4.3.1 CR1 を使用しています。

4

7 に答える 7

11

注釈を使用できますが、場合によっては誤った結果が得られる場合があります。これは double に関する一般的な問題であり、多くの場合 _Double_s は避ける必要があります。おそらく、別のタイプに切り替えることが最善の解決策でしょうか?たとえば、BigDecimal ?

于 2013-03-19T16:18:27.533 に答える
8

BigDecimal (または BigInteger) に切り替えた場合は、@DecimalMinまたは@DecimalMaxを使用できます。しかし、これはまだ float または double の解決策ではありません。

于 2015-01-28T20:14:01.667 に答える
5

double型と型を避け、精度とスケールに基づいて値をfloat検証できるカスタム バリデーターを実装しました。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;
    }
}

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


最後に、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 {}
}
于 2013-03-24T11:03:53.417 に答える