Проверка с двойным значением в 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;
}
}