Объект FormDataParam, переданный в виде строки JSON в запросе post, не десериализован должным образом

У меня есть вызов покоя, который принимает некоторые параметры, как FormDataParam. Когда я передаю объект EngineConfigMeta в строке json вызову rest из почтальона, на уровне restcall объект не десериализуется должным образом.

Rest-вызов

@Path( "/add-config" )
@POST
@Consumes( MediaType.MULTIPART_FORM_DATA )
@Produces( MediaType.APPLICATION_JSON )
public Response addConfig( @FormDataParam( "config" ) EngineConfigMeta config,
        @FormDataParam( "file" ) InputStream configFileInputStream,
        @FormDataParam( "file" ) FormDataContentDisposition cdh)
{

    return Response.ok(Response.Status.OK).entity(buildJson(config.getVersion())).build();
}

EngineConfigMeta.java

public class EngineConfigMeta {

  private String tenantName;
  private long version;

  EngineConfigMeta(String tenantName, long version) {
   this.tenantName = tenantName;
   this.version = version;
  }

  ..getters and setters
}

Вот как я передаю параметры для вызова покоя с помощью почтальона - скриншот почтальона

Теперь проблема в том, что когда я отлаживаю код вызова rest, я получаю всю строку json, назначенную только одному свойству в EngineConfigMeta pojo -

EngineConfigMeta{tenantName={"tenantName": "abc", "version": 2}, version=0}

Как вы можете видеть выше, вся строка json объекта присваивается свойству tenantName. Таким образом, десериализация не происходит правильно здесь.

Пожалуйста, помогите мне.

1 ответ

Решение

Это потому, что клиент должен установить Content-Type заголовок для человека "config" часть. Если вы этого не сделаете, то по умолчанию text/plain, Поскольку у вас есть конструктор, который принимает строку, Джерси просто предполагает присвоить значение аргумента конструктора входящим данным детали.

В Почтальоне я не думаю, что вы можете установить тип контента для отдельной части. Что вам нужно сделать, это вручную установить тип на стороне сервера с помощью FormDataBodyPart, Тогда вы можете вручную получить EngineConfigMeta,

public Response post(@FormDataParam("config") FormDataBodyPart part) {
    part.setMediaType(MediaType.APPLICATION_JSON_TYPE);
    EngineConfigMeta meta = part.getValueAs(EngineConfigMeta.class);
}

Смотрите также:

Другие вопросы по тегам