Проверка с двойным значением в Spring

Я хочу проверить счет, который имеет значение: 0,00 <= значение <= 10,00
Я использовал:
-Модель (Score):

 @Range(min = (long) 0.0, max = (long) 10.0)
 private double score;

-messages.properties:

Range.score.score=Please input 0<= score <=10

-servlet-context.xml:

   <beans:bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <beans:property name="basename" value="messages" />
    </beans:bean>

Но значение = 10.01 прошло проверку.
Пожалуйста, помогите мне.

4 ответа

Решение

Я решаю свой вопрос с помощью:

 @DecimalMax("10.0") @DecimalMin("0.0") 
 private double score;

Большое спасибо @ Kayaman,@ Hess

Есть две проблемы. Первая проблема - вы пытаетесь указать тип данных в атрибуте аннотации. Вам также не нужно указывать тип данных или дробь, эта аннотация принимает только целые числа.

Кроме того, как указано многими другими, удваивания и числа с плавающей запятой не допускают ошибок округления, поэтому вам нужно использовать BigDecimal вместо double. BigDecimal имеет метод doubleValue() для получения значения в виде double.

@Range(min = 0, max = 10)
private BigDecimal score;

Для тех, кто просто хочет поставить ограничение с сообщением

      @DecimalMin(value = "1.0", message = "Please Enter a valid Deposit Amount")
      import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DoublePrecisionValidator.class)
public @interface DoublePrecision {
    String message() default "Invalid double precision";

    int precision() default 2;

    int maxDigits() default 10;

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

public class DoublePrecisionValidator implements ConstraintValidator<DoublePrecision, Double> {
    private int precision;
    private int maxDigits;

    @Override
    public void initialize(DoublePrecision doublePrecision) {
        this.precision = doublePrecision.precision();
        this.maxDigits = doublePrecision.maxDigits();
    }

    @Override
    public boolean isValid(Double value, ConstraintValidatorContext context) {
        if (value == null) {
            return true; // Null values are considered valid, add additional checks if needed
        }

        // Check precision
        double scaledValue = value * Math.pow(10, precision);
        long truncatedValue = (long) scaledValue;
        double restoredValue = truncatedValue / Math.pow(10, precision);

        // Check maxDigits
        String stringValue = Double.toString(value);
        int totalDigits = stringValue.length() - (stringValue.contains(".") ? 1 : 0);

        return value.equals(restoredValue) && totalDigits <= maxDigits;
    }
}
Другие вопросы по тегам