All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bybutter.sisyphus.starter.grpc.transcoding.TranscodingErrorAttributes.kt Maven / Gradle / Ivy

package com.bybutter.sisyphus.starter.grpc.transcoding

import com.bybutter.sisyphus.rpc.Code
import com.bybutter.sisyphus.rpc.Status
import com.bybutter.sisyphus.rpc.invoke
import org.springframework.boot.web.reactive.error.ErrorAttributes
import org.springframework.stereotype.Component
import org.springframework.web.reactive.function.server.ServerRequest
import org.springframework.web.reactive.function.server.attributeOrNull
import org.springframework.web.server.ServerWebExchange

/**
 * Export error attributes from gRPC exceptions.
 */
@Component
class TranscodingErrorAttributes : ErrorAttributes {
    companion object {
        val ERROR_ATTRIBUTE = "${TranscodingErrorAttributes::class.java.name}.ERROR"
        val GRPC_STATUS_ATTRIBUTE = "grpcStatus"
    }

    override fun storeErrorInformation(error: Throwable, exchange: ServerWebExchange) {
        exchange.attributes[ERROR_ATTRIBUTE] = error
    }

    override fun getError(request: ServerRequest): Throwable {
        return request.attributeOrNull(ERROR_ATTRIBUTE) as? Throwable
            ?: throw IllegalStateException("Missing exception attribute in ServerWebExchange")
    }

    override fun getErrorAttributes(request: ServerRequest, includeStackTrace: Boolean): MutableMap {
        val error = getError(request)
        val status = if (error is TranscodingNotSupportException) {
            Status {
                code = Code.NOT_FOUND.number
                message = "No handlers matched for '${request.methodName()} ${request.path()}'"
            }
        } else {
            Status(error)
        }

        return mutableMapOf(
            // Store gRPC status
            GRPC_STATUS_ATTRIBUTE to status
        )
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy