我正在使用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我有一个通用的错误处理程序,它检查抛出的异常的类型,并返回适当的状态。但在这种情况下,检查MissingKotlinParameterException并返回400个错误请求是没有意义的,因为在其他情况下可能会抛出此异常。
此外,我可以在ctx.parse行后面添加onError,但这将是一个很大的ctx.parse,并且在每个处理程序中实现它并不遵循使用通用错误处理程序来保持API一致性的模式。有没有办法让Ratpack在解析失败时抛出一个特定的异常(比如ParseFailedException),这样我就可以捕捉到它并返回一个400错误的请求?
发布于 2018-08-23 23:06:02
作为一种变通方法,我编写了一个扩展方法:
fun <T: Any> Context.tryParse(type: Class<T>): Promise<T> {
return parse(type)
.onError { ex -> throw BadRequestException(ex) }
}其中,我的通用错误处理程序捕获BadRequestException,并将响应状态设置为400
https://stackoverflow.com/questions/51984155
复制相似问题