gpt4 book ai didi

spring - Kotlin 和 Spring MVC - HTTP 状态 400 - 空

转载 作者:行者123 更新时间:2023-12-02 12:55:20 28 4
gpt4 key购买 nike

我有一个 Kotlin @RestController,我希望它在 null 的情况下返回 400 Bad Request @RequestParam 参数传递。

示例:

@RestController
class Api() {

@PostMapping("endpoint")
fun endpoint(@DateTimeFormat(iso = DATE) @RequestParam date: LocalDate) {
//do something
}
}

如果我向 POST /endpoint?date 发出请求,我会收到一个 500 Internal Server Error,其中包含以下内容(已缩短)正文:

{
"timestamp": "2020-09-14T20:39:38.102+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Parameter specified as non-null is null: method Api.endpoint, parameter date",
"trace": "java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Api.endpoint, parameter date\r\n\tat Api.endpoint(Api.kt)\r\n\t
...
...
atjava.base/java.lang.Thread.run(Thread.java:834)\r\n",
"path": "/campaigns/contributions/unfunded/retries"
}

是否有任何方法可以使用一些额外的库、配置或一些没有其他副作用的自定义代码来解决这个问题,除了状态代码将为 400 之外,一切都保持不变错误的请求

最佳答案

以下适用于 Kotlin 1.4.*。这不一定是最佳答案,因为不能保证 Kotlin 在未来的版本中不会更改消息的 excption 类型。例如,当我最初问这个问题时我使用的是 1.3.*,异常是 IllegalArgumentException。在 1.4.* 中已更改为 NullPointerException。

@ControllerAdvice
class KotlinNonNullParamHandling {

@ExceptionHandler
protected fun handleKotlinNonNullViolation(
exception: NullPointerException,
response: HttpServletResponse
) {
val nullParameter = exception.message?.startsWith("Parameter specified as non-null is null: ") == true
val restController = exception
.stackTrace
.getOrNull(0)
?.let { Class.forName(it.className) }
?.getAnnotation(RestController::class.java) != null
val status =
if (nullParameter && restController) HttpStatus.BAD_REQUEST
else HttpStatus.INTERNAL_SERVER_ERROR
response.sendError(status.value(), exception.message)
}
}

在假设是400之前,我们正在检查异常

  • 是一个NullPointerException
  • 有一条以“指定为非空的参数为空:”开头的消息
  • 它是从 RestController 类中抛出的(否则可能是其他问题,例如通过反射将 null 发送到与 Web 层无关的方法。)

关于spring - Kotlin 和 Spring MVC - HTTP 状态 400 - 空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63892052/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com