es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spring Boot + webflux: No se pudo resolver la vista con el nombre.

Necesito responder con datos de imagen en formato jpeg

@Controller
@RequestMapping("/resource")
class ResourceController() {

    @GetMapping("/thumbnail/{userFileId}/{group}/{index}", produces = [MediaType.IMAGE_JPEG_VALUE])
    suspend fun getThumbnail(
        @PathVariable userFileId: String,
        @PathVariable group: String,
        @PathVariable index: Int,
        response: ServerHttpResponse
    ) {
        val url = service.getThumbnailUrl(userFileId, group, index)
            ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)

        response.headers.contentType = MediaType.IMAGE_JPEG
        response.statusCode = HttpStatus.OK
        streamResponse(url, response)
    }
}

@Throws(ResponseStatusException::class) private fun streamResponse(url: String, response: ServerHttpResponse) { .... response.headers.contentLength = contentLength content.use { content -> response.writeWith( DataBufferUtils.readInputStream({ content }, response.bufferFactory(), 128) ).subscribe() } }

Funciona, pero hay un error en la consola:

Could not resolve view with name 'resource/thumbnail/xxx/common/2'

El mismo enfoque funciona con spring-boot-starter-web.

Desafortunadamente, no puedo encontrar la documentación sobre cómo usar Spring Boot + Kotlin + WebFlux.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en spring-boot, kotlin y webflux, puedo ayudarte con la siguiente pregunta:

    P: ¿Cómo puedo responder con datos de imagen jpeg usando Spring Boot, Kotlin y Webflux?

    R: Puedes usar la anotación @GetMapping con el atributo produces establecido en MediaType.IMAGE_JPEG_VALUE. Tu método del controlador debe tener un parámetro ServerHttpResponse para escribir los datos de imagen en la respuesta. Aquí tienes un ejemplo:

    @Controller
    @RequestMapping("/resource")
    class ResourceController() {
    
        @GetMapping("/thumbnail/{userFileId}/{group}/{index}", produces = [MediaType.IMAGE_JPEG_VALUE])
        suspend fun getThumbnail(
            @PathVariable userFileId: String,
            @PathVariable group: String,
            @PathVariable index: Int,
            response: ServerHttpResponse
        ) {
            // Obtén los datos JPEG desde tu servicio y establece los encabezados de respuesta
            response.headers.contentType = MediaType.IMAGE_JPEG
            response.statusCode = HttpStatus.OK
    
            // Transmite los datos JPEG en la respuesta usando DataBufferUtils
            streamResponse(jpegData, response)
        }
    
        private fun streamResponse(jpegData: ByteArray, response: ServerHttpResponse) {
            val contentLength = jpegData.size.toLong()
    
            // Establece el encabezado de longitud de contenido
            response.headers.contentLength = contentLength
    
            // Escribe los datos JPEG en la respuesta usando DataBufferUtils
            content.use { content ->
                response.writeWith(
                    DataBufferUtils.readInputStream({ content.inputStream() }, response.bufferFactory(), 128)
                ).subscribe()
            }
        }
    }
    

    Ten en cuenta que es posible que encuentres el error “Could not resolve view with name” al intentar usar Webflux. Esto parece ser un error con FreeMarkerAutoConfiguration de Spring Boot. Para solucionarlo, puedes desactivar FreeMarker agregando las siguientes propiedades a tu archivo application.yml:

    spring:
      autoconfigure:
        exclude:
          - org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration
    

Comments are closed.