Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取玻璃鱼&x27;s MOXy将JSON转换为POJO_Java_Json_Jersey_Glassfish_Moxy - Fatal编程技术网

Java 获取玻璃鱼&x27;s MOXy将JSON转换为POJO

Java 获取玻璃鱼&x27;s MOXy将JSON转换为POJO,java,json,jersey,glassfish,moxy,Java,Json,Jersey,Glassfish,Moxy,我有一个web应用程序,它通过一个包含二进制数据和JSON字符串的多部分表单数据POST上传文件。(JSON字符串是使用浏览器的JSON.stringify(obj)函数创建的) 根据Glassfish 4.0.1以来的文档,Glassfish使用MOXy来解组JSON和XML对象 我的方法如下所示: @POST @Path("put") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON)

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

根据Glassfish 4.0.1以来的文档,Glassfish使用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)));
        }
这不起作用,因为MOXy的Glassfish 5实现来自com.sun.xml.*而不是Eclipse。通过跟踪代码,该实现似乎会在任何setProperty调用上引发异常,因为它不支持任何特定于实现的属性

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


有人知道怎么做吗?

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

公共响应put(@FormDataBodyPart(“元数据”)FormDataBodyPart metaDataPart){
setMediaType(MediaType.APPLICATION\u JSON\u TYPE);
MetaData MetaData=metaDataPart.getValueAs(MetaData.class);
}
请在中查看有关此的更多信息



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

首先,我建议切换到使用Jackson。其次,您可以直接从FormDataBodyPart获取POJO。看一看。要使用Jackson,只需在项目中包含jersey media json Jackson依赖项(在提供的范围内),并在jersey应用程序中注册JacksonFeature。即使您不切换到Jackson,您仍然可以直接从FormDataBodyPart获取POJO。只需使用
bodyPart.getValueAs(POJO.class)
将媒体类型设置为application/json后。@PaulSamsotha谢谢你的回答,我不知道我能做到。如果你想写下来作为答案,我会给你贴上标签。@PaulSamsotha我以前使用过JacksonXML,但在这个项目上,我只是使用了Glassfish提供的默认值。有没有关于为什么杰克逊会更好的参考资料?(我注意到Jackson附带了Glassfish软件包,尽管它不是默认的。)
um.setProperty("eclipselink.media-type", "application/json");