FormDataParam在post请求中作为JSON字符串传递的对象没有得到正确的反序列化
问题描述:
我有一个休息调用,它将一些参数作为FormDataParam。当我将json字符串中的对象EngineConfigMeta传递给postman的其他调用时,在restcall级别,对象没有正确地进行反序列化。FormDataParam在post请求中作为JSON字符串传递的对象没有得到正确的反序列化
休息待命
@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调用 - Postman screenshot
现在的问题是,当我调试REST调用的代码,我得到全部分配到只有一个属性上EngineConfigMeta POJO JSON字符串 -
EngineConfigMeta{tenantName={"tenantName": "abc", "version": 2}, version=0}
正如你可以在上面看到,整个对象JSON字符串分配tenantName属性。所以反序列化在这里没有发生。
请帮帮我。
答
这是因为客户端需要为个人"config"
部分设置Content-Type
标头。如果你不这样做,那么它将默认为text/plain
。因为你有一个接受字符串的构造函数,Jersey只是假设将构造函数参数的值赋给传入的零件数据。
在邮差我不认为你可以设置个别部分的内容类型。你需要做的是使用FormDataBodyPart
手动设置服务器端的类型。然后你可以手动获取EngineConfigMeta
。
public Response post(@FormDataParam("config") FormDataBodyPart part) {
part.setMediaType(MediaType.APPLICATION_JSON_TYPE);
EngineConfigMeta meta = part.getValueAs(EngineConfigMeta.class);
}
参见:
感谢您的回答,我已经尝试之前,似乎工作。 – thedevd