Объект 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);
}
Смотрите также: