Ошибка «Не удается найти MessageBodyReader» с многокомпонентным запросом, содержащим файл и JSON - PullRequest
1 голос
/ 23 апреля 2020

У меня есть простое приложение Quarkus с ресурсом POST.

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response updateContent(@MultipartForm MyRequest request) {
    bus.sendAndForget("request", request);
    return Response.accepted().build();
}

Мой запрос выглядит следующим образом:

public class MyRequest {
  @FormParam("template")
  @PartType(MediaType.APPLICATION_OCTET_STREAM)
  private byte[] template;

  @FormParam("data")
  @PartType(MediaType.TEXT_PLAIN)
  private Map<String, String> data;

  // Default constructor & getters
}

Затем я отправляю следующее с почтальоном:

enter image description here

Затем я получаю следующую ошибку:

java.lang.RuntimeException: RESTEASY007545: Unable to find a MessageBodyReader for media type: text&#x2F;plain; charset=us-ascii and class type java.util.Map

Если я отправляю только шаблон, он работает, поэтому кажется, что JSON строка не может быть проанализирована по какой-то причине.

Я думаю, что у меня есть все необходимые зависимости, такие как:

  • quarkus-resteasy-jackson
  • resteasy-multipart-provider
  • resteasy-jackson2-provider

И я также попытался вручную зарегистрировать ResteasyJackson2Provider и изменить mediaType свойства data на APPLICATION_ JSON, но это не помогло. Помогите. Чего мне не хватает, или я даже правильно отправляю JSON?

1 Ответ

2 голосов
/ 23 апреля 2020

Для данных формы имеются только файловые и текстовые поля. Из-за этого любой тип все равно будет интерпретироваться как текст / обычный текст в форме данных. Однако есть параметр, который можно установить в фильтре запросов, прежде чем он приступит к анализу данных.

Создать экземпляр ContainerRequestFilter:

@ApplicationScoped
@Provider
public class MyFilter implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        // apply next only for your form-data path and ignore all the other requests
        final HttpRequest httpRequest = ResteasyContext.getContextData(HttpRequest.class);
        httpRequest.setAttribute("resteasy.provider.multipart.inputpart.defaultContentType", "application/json");
    }
}
...