gpt4 book ai didi

java - 使用 Glassfish 的 MOXy 将 JSON 转换为 POJO

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

我有一个 Web 应用程序,它通过 MULTIPART_FORM_DATA POST 上传文件,其中包含二进制数据和 JSON 字符串。 (JSON 字符串是使用浏览器的 JSON.stringify(obj) 函数创建的)。

根据文档 Glassfish 自 4.0.1 起使用 MOXy 来解码 JSON 和 XML 对象。

我的方法如下所示:

@POST
@Path("put")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response put(@FormDataParam("file") List<FormDataBodyPart> bodyParts,
@FormDataParam("metadata") List<String> metaParts) throws JAXBException {

JAXBContext jbc = JAXBContext.newInstance(MetaData.class);

for (int index = 0; index < metaParts.size(); index += 1) {

MetaData meta = null;
String metaString = metaParts.get(index);
if (metaString != null && !metaString.isEmpty()) {
Unmarshaller um = jbc.createUnmarshaller();
// um.setProperty(???, "application/json");
meta = (MetaData) um.unmarshal(new StreamSource(new StringReader(metaString)));
}

这样的代码将尝试将 metaString 中的数据解析为 XML 文档,因此会引发异常。

搜索可用文档,我发现 EclipseLink MOXy 实现的解决方案似乎是执行

um.setProperty("eclipselink.media-type", "application/json");

这不起作用,因为 MOXy 的 Glassfish 5 实现来自 com.sun.xml.* 而不是 Eclipse。跟踪代码,似乎此实现将在任何 setProperty 调用上抛出异常,因为它不支持任何特定于实现的属性。

但我知道 Sun 的 MOXy 可以做到这一点,因为它可以很好地处理我的 HTTP 请求/响应。然而我在任何地方都找不到示例或文档——条条大路都通 EclipseLink 实现。

有人知道怎么做吗?

最佳答案

您不需要手动解析数据。您可以做的是将正文部分作为 FormDataBodyPart 获取,就像您已经对 "file" 部分所做的那样。在 FormDataBodyPart 中,您需要将媒体类型设置为 application/json1,然后使用 bodyPart 获取 POJO .getValueAs(POJO.class).

public Response put(@FormDataBodyPart("metadata") FormDataBodyPart metaDataPart) {
metaDataPart.setMediaType(MediaType.APPLICATION_JSON_TYPE);
MetaData metaData = metaDataPart.getValueAs(MetaData.class);
}

有关此内容的更多信息,请参阅 File upload along with other object in Jersey restful web service

<小时/>

1 - 在多部分请求中,每个正文部分都有自己的 Content-Type header 。如果您不设置它,它将自动被视为默认的 text/plain。使用 Javascript,您无法设置各个部分的内容类型,因此它将默认为 text/plain。但我们需要它是 application/json ,以便 JAX-RS JSON 提供程序用于反序列化。

关于java - 使用 Glassfish 的 MOXy 将 JSON 转换为 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54241274/

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