2017-09-15 258 views
1

我有一个休息调用,它将一些参数作为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属性。所以反序列化在这里没有发生。

请帮帮我。

回答

0

这是因为客户端需要为个人"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); 
} 

参见:

+0

感谢您的回答,我已经尝试之前,似乎工作。 – thedevd

相关问题