Как проверить тело запроса и ответить подробностями об ошибке с помощью Spring?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как проверить тело запроса и ответить подробностями об ошибке с помощью Spring?

Сообщение Anonymous »

Я хочу проверить тело запроса

Код: Выделить всё

import jakarta.validation.constraints.*;

data class RequestBodyDTO(
@NotBlank(message = "ID is required.")
val id: String
)
для этого примера конечной точки

Код: Выделить всё

import jakarta.validation.Valid
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController("do-something")
@RequestMapping("/command/do-something")
class Handler {
@PostMapping
fun handle(@Valid @RequestBody requestRequestBody: RequestBodyDTO): ResponseEntity {
return ResponseEntity.ok().build()
}
}
AFAIK Spring не обрабатывает ошибки проверки автоматически, поэтому потребители API не получат никаких подробностей об ошибках. После поиска в Google мне кажется, что мне нужно настроить для этого глобальный обработчик ошибок

Код: Выделить всё

import org.springframework.http.HttpStatus
import org.springframework.validation.FieldError
import org.springframework.web.bind.MethodArgumentNotValidException
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseStatus

@ControllerAdvice
class ValidationExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException::class)
fun handleValidationException(
exception: MethodArgumentNotValidException
): Map {
return exception.bindingResult.allErrors.associate { error ->
val fieldName = (error as FieldError).field
val errorMessage = error.defaultMessage

fieldName to errorMessage
}
}
}
При вызове

POST http://localhost:8080/command/do-something
Я ожидал бы 400 с информацией об отсутствии поля идентификатора. Но я получаю только

Код: Выделить всё

{
"timestamp": "2025-01-09T09:38:11.218+00:00",
"path": "/command/do-something",
"status": 400,
"error": "Bad Request",
"requestId": "94d9009e-2"
}
Как мне сообщить Spring, чтобы он проверил RequestBodyDTO и ответил 400 (и подробностями об ошибке), если DTO недействителен?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ing-spring
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»