我正在用Ratpack框架在Kotlin中编写一个API,使用Jackson来反序列化JSON请求主体。当我发送无效的请求正文时,我的应用程序引发500个内部服务器错误异常:
import com.google.inject.Inject
import com.mycompany.mynamespace.MyComponent
import ratpack.func.Action
import ratpack.handling.Chain
import java.util.UUID
class MyTestEndpoint @Inject constructor(
private val myComponent: MyComponent) : Action<Chain> {
override fun execute(chain: Chain) {
chain
.post { ctx ->
ctx.parse(MyParams::class.java)
.map { parsedObject -> myComponent.process(parsedObject) }
.then { ctx.response.send() }
}
}
}
data class MyParams(val borrowingId: UUID)
当该端点被无效的请求正文击中时,异常是:
com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class com.mycompany.mynamespace.MyParams] value failed for JSON property borrowingId due to missing (therefore NULL) value for creator parameter borrowingId which is a non-nullable type
我有一个通用的错误处理程序,它检查抛出的Exception类型,并返回适当的状态。但是在这种情况下,检查MissingKotlinParameterException并返回400错误请求是没有意义的,因为在其他情况下可能会抛出此异常。
此外,我可以在ctx.parse行之后添加onError,但这将是一个很大的API,并且在每个处理程序中实施该操作都不会遵循使用通用错误处理程序来保持API一致的模式。有没有一种方法可以使Ratpack在解析失败时引发特定的异常(类似ParseFailedException
),以便我可以捕获它并返回400错误的请求?
答案 0 :(得分:0)
作为解决方法,我编写了一个扩展方法:
SELECT id FROM user WHERE phone = '0123456789'
我的通用错误处理程序在其中捕获BadRequestException,并将响应状态设置为400