gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:25:25 73 4
gpt4 key购买 nike

我有一个 rest 调用,它将一些参数作为 FormDataParam。当我将 json 字符串中的对象 EngineConfigMeta 传递给 postman 的其余调用时,在 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 调用的方式 - Postman screenshot

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

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

正如您在上面看到的,整个对象 json 字符串都分配给了 tenantName 属性。所以反序列化在这里没有正确发生。

请帮助我。

最佳答案

这是因为客户端需要为单独的"config" 部分设置Content-Type header 。如果您不这样做,那么它将默认为 text/plain。因为您有一个接受字符串的构造函数,所以 Jersey 只是假定将构造函数参数的值分配给传入的部分数据。

在 Postman 中,我不认为你可以设置单个部分的内容类型。您需要做的是使用 FormDataBodyPart 在服务器端手动设置类型。然后你可以手动获取EngineConfigMeta

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

另请参阅:

关于java - 在 post 请求中作为 JSON 字符串传递的 FormDataParam 对象未正确反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46236193/

73 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com