У меня есть запрос как
{
"name" : "test"
}
RequestDTO вот так
data class DTO (
val name: String
val maxValue: Long
)
Ожидается: сбой сериализации Json из-за отсутствия свойства maxValue. что происходит: Джексон устанавливает maxValue = 0;
Я пытался использовать свойство DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES.
но
НЕ РАБОТАЕТ, ЕСЛИ СОБСТВЕННОСТЬ ОТСУТСТВУЕТ. ЭТО РАБОТАЕТ ТОЛЬКО ЕСЛИ У ВАС ЕСТЬ ЯВНЫЙ НУЛЬ В ЗАПРОСАХ
Десериализация Джексоном отсутствующего значения числа JSON до 0,0 весной имеет неправильный ответ
@JsonProperty(required = true)
Это не решение, потому что мне нужна глобальная конфигурация, чтобы запретить преобразование значения отсутствия в нули.





Вы можете использовать
jacksonObjectMapper.enable(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES)
Это немного изменит ошибку, но вы получите 400 неверных запросов, как и ожидалось.
Вы имеете в виду 400 Bad request? (404 означает, что файл не найден)
да, я имел в виду 400, моя опечатка
Судя по тому, что я получаю, вам нужен неверный запрос, когда maxValue не передано, Я не смог найти идеального решения, но пока это будет работать, пока я не найду что-то получше.
добавьте их в свой pom.xml или gradle (версия вашей сборки gradle)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
обновите класс данных DTO, чтобы:
import jakarta.validation.constraints.NotNull
data class Dto(
@field:NotNull(message = "cannot be null")
val name: String,
@field:NotNull( message = "must not be null")
val maxValue: Long?
)
и ваш контроллер должен выглядеть примерно так:
import com.example.demo.dto.Dto
import jakarta.validation.Valid
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController
@RestController
class HelloController {
@PostMapping
fun postData(@Valid @RequestBody dto: Dto): Dto {
return dto
}
}
это вызовет Resolved [org.springframework.web.bind.MethodArgumentNotValidException
{
"name": "test"
}
который приведет к неправильному ответу на запрос следующим образом:
{
"timestamp": "2024-06-19T11:04:10.776+00:00",
"status": 400,
"error": "Bad Request",
"path": "/"
}
К сожалению, в ответе об ошибке также не отображается сообщение, прикрепленное к аннотации. Надеюсь, вы сможете найти способ исправить это, используя @ExceptionHandler
В идеале ошибка выглядела бы так
{
"errors": [
"Name cannot be null",
"maxValue cannot be null"
]
}
Насколько я понял, я думаю, что ОП на самом деле хочет, чтобы десериализация выдавала исключение, если в данных JSON отсутствует значение. Его вопрос сбивает с толку, потому что он говорит о нуле, когда в нем нет нулей. Но он говорит, что ожидает неудачной десериализации.
Мне нужен неправильный запрос, потому что он не представляет никакой ценности. отсутствующее значение!= ноль. Отредактированный пример исключения
Я обновил свой ответ... проверьте новое решение
Решение, приведенное выше, будет работать, потому что Kotlin установит значение null равным 0, а @Min поймает его, что достигнет 400, вы можете попробовать решение и посмотреть. помните, что ваше maxValue не имеет символа, допускающего значение NULL.
максимальное значение может быть 0 или отрицательным.
Я обновил код для работы с 0 и отрицательными числами.
Отвечает ли это на ваш вопрос? Как заставить Джексона использовать параметры Kotlin по умолчанию для отсутствующих значений?