【问题标题】:Handle @NotBlank errors - Spring Boot处理 @NotBlank 错误 - Spring Boot
【发布时间】:2021-06-21 00:00:31
【问题描述】:

我正在尝试处理 Spring Boot 应用程序中 @NotBlank 注释引发的异常。到目前为止,我的代码处理了@Size@Email 注释抛出的MethodArgumentNotValidException。但是,当我期望返回 @NotBlank 消息时,我得到一个空响应正文,向我表明正在引发不同类型的异常,但我不清楚是哪一个:

查看正在验证的模型:

import javax.validation.constraints.Email
import javax.validation.constraints.NotBlank
import javax.validation.constraints.Size

data class SignupDto(
    @field:NotBlank(message = "Email Address is mandatory.")
    @field:Email(message = "Email Address is invalid.")
    val emailAddress: String,

    @field:NotBlank(message = "First Name is mandatory.")
    @field:Size(min = 2, max = 255, message = "First Name must be between 2 and 255 characters.")
    val firstName: String,

    @field:Size(min = 2, max = 255, message = "Last Name must be between 2 and 255 characters.")
    val lastName: String? = null,

    @field:NotBlank(message = "Password is mandatory")
    val password: String
)

还有处理程序

package com.travisalexandersmith.runjamaicaapi.auth

import com.travisalexandersmith.runjamaicaapi.auth.exceptions.EmailAddressTakenException
import com.travisalexandersmith.runjamaicaapi.global.responses.ErrorMessage
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.http.HttpHeaders
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.MethodArgumentNotValidException
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.context.request.WebRequest
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler

@ControllerAdvice
class AuthControllerAdvisor : ResponseEntityExceptionHandler() {
    private val logger: Logger = LoggerFactory.getLogger("AuthControllerAdvisor")

    @ExceptionHandler(EmailAddressTakenException::class)
    fun handleEmailAddressTakenExceptions(
        exception: EmailAddressTakenException,
        request: WebRequest
    ): ResponseEntity<ErrorMessage> {
        logger.info(exception.message)
        val errorMessage = ErrorMessage(exception.message)
        return ResponseEntity<ErrorMessage>(errorMessage, HttpStatus.CONFLICT)
    }

    override fun handleMethodArgumentNotValid(
        ex: MethodArgumentNotValidException,
        headers: HttpHeaders,
        status: HttpStatus,
        request: WebRequest
    ): ResponseEntity<Any> {
        val fieldErrors = ex.bindingResult.fieldErrors.map { it.defaultMessage }
        return ResponseEntity<Any>(ErrorMessage(error = "Invalid request body.", details = fieldErrors), HttpStatus.BAD_REQUEST)
    }
}

这是关联的控制器:

package com.travisalexandersmith.runjamaicaapi.auth

import com.travisalexandersmith.runjamaicaapi.auth.dto.SignupDto
import com.travisalexandersmith.runjamaicaapi.auth.responses.AuthResponse
import com.travisalexandersmith.runjamaicaapi.auth.services.AuthService
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.HttpStatus
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.*
import javax.validation.Valid


@RestController
@RequestMapping("auth")
@Validated
class AuthController @Autowired constructor(val authService: AuthService) {
    private val logger: Logger = LoggerFactory.getLogger("AuthController")

    @PostMapping("/signup")
    @ResponseStatus(HttpStatus.CREATED)
    fun signup(@Valid @RequestBody signupDto: SignupDto): AuthResponse {
        logger.info("Request to signup for user with email address ${signupDto.emailAddress}")
        return authService.signup(signupDto)
    }
}

我应该在此处添加什么来管理@NotBlank 的异常?

【问题讨论】:

  • 您如何测试/使用验证?在控制器方法中,还是在服务方法中?
  • 验证在控制器方法上,我把它添加到问题中
  • 这很奇怪,MethodArgumentNotValidException 应该是正确的。也许您可以添加另一种带有包罗万象的方法 Exception 并调试您到底得到了什么异常?你也可以从我的开源库Error Handling Spring Boot Starter 中获得一些灵感(或者如果它符合你的要求,就用它代替你自己的处理程序)。
  • 奇怪的是,如果我不扩展ResponseEntityExceptionHandler,我只能看到抛出的错误org.springframework.http.converter.HttpMessageNotReadableException,我会用更多信息更新问题

标签: java spring-boot kotlin


【解决方案1】:

直到我停止在控制器中扩展 ResponseEntityExceptionHandler 后我才能看到错误我看到这个错误来自 DefaultHandlerExceptionResolver

 com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class com.travisalexandersmith.runjamaicaapi.auth.dto.SignupDto] value failed for JSON property emailAddress due to missing (therefore NULL) value for creator parameter emailAddress which is a non-nullable type

问题是SignupDto 中的字段必须标记为可为空,否则当它们丢失时会引发此异常:

data class SignupDto(
    @field:NotBlank(message = "Email Address is mandatory.")
    @field:Email(message = "Email Address is invalid.")
    val emailAddress: String?,

    @field:NotBlank(message = "First Name is mandatory.")
    @field:Size(min = 2, max = 255, message = "First Name must be between 2 and 255 characters.")
    val firstName: String?,

    @field:Size(min = 2, max = 255, message = "Last Name must be between 2 and 255 characters.")
    val lastName: String? = null,

    @field:NotBlank(message = "Password is mandatory")
    val password: String?
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 2022-06-17
    • 2020-10-08
    • 1970-01-01
    • 2018-12-09
    • 2017-07-02
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多