获取Glassfish的MOXy将JSON转换为POJO

时间:2019-01-17 17:27:54

标签: java json jersey glassfish moxy

我有一个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调用上引发Exception,因为它不支持任何实现特定的属性。

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

有人知道该怎么做吗?

1 个答案:

答案 0 :(得分:1)

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

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标头。如果未设置,则默认将其视为text/plain。使用Javascript,您无法设置各个部分的内容类型,因此它将默认设置为text/plain。但是我们需要将其设置为application/json,以便将JAX-RS JSON提供程序用于反序列化。