Java post请求中作为JSON字符串传递的FormDataParam对象未正确反序列化

Java post请求中作为JSON字符串传递的FormDataParam对象未正确反序列化,java,rest,jersey,multipartform-data,postman,Java,Rest,Jersey,Multipartform Data,Postman,我有一个rest调用,它将一些参数作为FormDataParam。当我将json字符串中的object EngineConfigMeta传递给postman的rest调用时,在restcall级别,该对象没有得到正确的反序列化 休息通话 @Path( "/add-config" ) @POST @Consumes( MediaType.MULTIPART_FORM_DATA ) @Produces( MediaType.APPLICATION_JSON ) public Response add

我有一个rest调用,它将一些参数作为FormDataParam。当我将json字符串中的object EngineConfigMeta传递给postman的rest调用时,在restcall级别,该对象没有得到正确的反序列化

休息通话

@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
}
这就是我使用postman将参数传递给rest调用的方式-

现在的问题是,当我调试rest调用的代码时,我只将所有json字符串分配给EngineConfigMeta pojo上的一个属性-

EngineConfigMeta{tenantName={"tenantName": "abc", "version": 2}, version=0}
如上所述,整个对象json字符串被分配给了tenantName属性。因此,反序列化在这里没有正确发生


请帮助我。

这是因为客户端需要为单个
“config”
部分设置
内容类型
标题。如果不执行此操作,则默认为
text/plain
。因为您有一个接受字符串的构造函数,Jersey只假设将构造函数参数的值分配给传入的零件数据

在《邮递员》中,我认为您无法设置单个部分的内容类型。您需要做的是使用
FormDataBodyPart
在服务器端手动设置类型。然后您可以手动获取
EngineConfigMeta

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


谢谢你的回答,我以前已经试过了,而且似乎很有效。