Переопределить конвертер сообщений по умолчанию MediaType - PullRequest
0 голосов
/ 22 октября 2018

Попытка создать конечную точку REST для загрузки изображений в форматах PNG, SVG, JPG, GIF.И первая проблема, с которой я столкнулся, заключается в том, что:

  • Если я определю @GetMapping(produces = MediaType.IMAGE_PNG_VALUE), тогда мне удастся загрузить файл PNG, но эта конечная точка должна поддерживать загрузку нескольких типов файлов мультимедиа - png,SVG, JPG, GIF.

  • Если я определю @GetMapping(produces = {MediaType.IMAGE_PNG_VALUE, "image/svg+xml"}) и попытаюсь загрузить SVG-файл, он может интерпретироваться как image/png вместо image/svg+xml.

Это мой FileController:

@RestController
@RequestMapping("/v1/files")
public class FileController {

    @GetMapping(value = "/{id}", produces = {MediaType.IMAGE_PNG_VALUE, "image/svg+xml"})
    public Mono<Resource> download(@PathVariable UUID id) {
        return fileService.download(id);
    }

}

Что я делаю не так?

МЫСЛИ:

Мысль переопределить типы носителей по умолчанию следующим образом:

@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {

    @Override
    public void configureContentTypeResolver(RequestedContentTypeResolverBuilder builder) {
        builder.fixedResolver(MediaType.valueOf("image/svg+xml"), MediaType.IMAGE_PNG);
    }

}

Но все то же поведение, что и для @GetMapping(produces = {MediaType.IMAGE_PNG_VALUE, "image/svg+xml"}).Что я делаю не так?Как определить другой тип контента, зависит от двоичного файла ресурса?

РЕШЕНИЕ

В рамках процесса загрузки я определяю MediaType файла на основе расширения файла и сохраняю его с другимиметаданные файла в дБ.Затем я использую этот сохраненный MediaType в процессе загрузки следующим образом:

@GetMapping(value = "/{id}")
public Mono<ResponseEntity> download(@PathVariable UUID id) {
    return fileService.download(id)
                      .map(tuple -> ResponseEntity.ok()
                                                  .contentType(tuple.getT1().getMediaType())
                                                  .body(tuple.getT2()));
}

Приветствуются более модные решения

...