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.
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 atributoproduces
establecido enMediaType.IMAGE_JPEG_VALUE
. Tu método del controlador debe tener un parámetroServerHttpResponse
para escribir los datos de imagen en la respuesta. Aquí tienes un ejemplo: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
: