Проверка Spring Boot принимает значение с плавающей точкой в ​​целочисленном поле - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь реализовать службу POST с проверкой запроса.

Мой метод Controller выглядит примерно так:

public void updateScore(@Valid ScoreRequest)

ScoreRequest выглядит ниже

import javax.validation.constraints.*;
import lombok.Data;

@Data
public class ScoreRequest {
    @Min(0)
    @Max(100)
    @Digits(fraction = 0, integer = 3)
    private Integer score;

    ...
}

Все работает нормально, пока я не передам целочисленные значения для счета, однако, если я также передам дробную часть, запрос пройдет, и Spring каким-то образом урезает дробь и использует целочисленную часть в запросе.

Я ожидал, что он выдаст ошибку проверки, поскольку тип данных оценки не совпадает.

Он работает с последующим запросом и использует 10 в качестве значения оценки в объекте запроса. Я ожидаю, что это выдаст ошибку, что я делаю не так?

{"score": 10.234234}

Версия Spring Boot: 2.0.3.RELEASE

Ответы [ 3 ]

1 голос
/ 06 января 2020

Я пытался отладить классы проверки Spring Boot, чтобы найти, что происходит, но после просмотра комментария @ M.Denium я искал проблемы Джексона и нашел соответствующую запись SO.

Java Джексон - не допускать преобразования с плавающей точкой в ​​int при десериализации

Я использую ответ @Jichao Zhang, однако также работает только подтверждение ответа @Eduardo Sanchez-Ros. Это то, что работает для меня.

ObjectMapper.configure(DESERIALIZATION_FEATURE.ACCEPT_FLOAT_AS_INT, false);
0 голосов
/ 06 января 2020

Если вы внимательно посмотрите на определение аннотации @digits,

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })

Так что эту аннотацию можно применить и к методам.
Если вы читаете документы, в нем говорится, что эта аннотация может применяться к следующим типам

  • BigDecimal
  • BigInteger
  • CharSequence
  • байт (или байт)
  • короткий (или короткий)
  • int (или целое число)
  • длинный (или длинный)

integer поле аннотации проверяет количество целых цифр, а поле fraction аннотации проверяет количество дробных цифр.

С тех пор, как вы объявили, что ваше поле является целочисленным значением. Он преобразует значение в целое число и усекает дробную часть.
Это не приводит к ошибкам проверки, поскольку оба поля удовлетворяют проверке.

Эта аннотация в идеале должна использоваться только с типом BigDecimal.

0 голосов
/ 06 января 2020

Не используйте эту аннотацию: @Digits(fraction = 0, integer = 3 с Integer, поскольку бесполезно устанавливать дроби для Integer.

Почему бы вам не сделать:

@Min(0)
@Max(100)
@Digits(fraction = 0, integer = 3)
private BigDecimal score;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...