【发布时间】: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