当前位置: 首页 > 知识库问答 >
问题:

同时支持APPLICATION_JSON和MULTIPART_FORM_DATA的Jersey2无法接受JSON输入

郜驰
2023-03-14

我刚接触Jersey并尝试实现一个可以分别接受application/json和multipart/form-data content-type的POSTendpoint。

    @POST
    @Path("/upload")
    @Consumes({MediaType.APPLICATION_JSON, MediaType.MULTIPART_FORM_DATA})
    @Produces({MediaType.APPLICATION_JSON, MediaType.MULTIPART_FORM_DATA})
    public void upload(@FormDataParam("jsonInput") MyPojo req,
            @FormDataParam("file") FormDataBodyPart file)
    {
        //...
    }

下面是Spring Boot依赖关系:

    dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
    </dependency>

我通过扩展ResourceConfig和注册我的REST API类配置了必要的资源,还包括一些标准的资源,如下所示:

    register(MyRestImpl.class);
    register(JacksonFeature.class);
    register(MultiPartFeature.class);

Maven依赖项中已经添加了“jersey-media-json-jackson”,它应该负责序列化/反序列化POJO。

现在,我看到发送JSON输入作为多部分请求的一部分,工作正常。然而,仅仅发送与content-type:application/JSON相同的JSON输入甚至无法击中服务,并且Postman报告如下反序列化错误:

Cannot find a deserializer for non-concrete Map type [map type; class javax.ws.rs.core.MultivaluedMap, [simple type, class java.lang.String] -> [collection type; class java.util.List, contains [simple type, class java.lang.String]]]
 at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 1]

为什么以application/JSON Content-Type的形式发送JSON数据不起作用,而以multipart/form-data Content-Type的形式发送相同的JSON数据起作用?我不认为,我们需要为此做任何特别的注释,对吗?

共有1个答案

阙弘博
2023-03-14

在同一方法中同时接受multipart和JSON是行不通的。原因是它们不能正确地反序列化为相同的对象和不同数量的参数和注释以支持Multipart。不过,您可以做的是有两个方法(指向相同的URL),每个方法具有不同的媒体类型。

@POST
@Path("/upload")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public void json(JsonPojo pojo) { }

@POST
@Path("/upload")
@Consumes({MediaType.MULTIPART_FORM_DATA})
@Produces({MediaType.APPLICATION_JSON})
public void upload(@FormDataParam("jsonInput") MyPojo req,
                   @FormDataParam("file") FormDataBodyPart file) { }
 类似资料:
  • 我有一个很好用的Spring控制器: null

  • 我在while循环中遇到了这个问题: 这个while循环只接受一次输入,不会再次请求它,所以它会循环整个时间接受一次该输入。我在这里做错了什么,因为对我来说,这个诡计循环真的很奇怪? InputHandler类:

  • 我的输入JSON如下所示,但是我不确定如何使用JOLT进行内部数组相关的参数转换。感谢任何帮助,因为我是新的JOLT 以下是我创建的规范文件,但它并不完整 预期输出如下 我正在使用这个库https://github.com/bazaarvoice/jolt

  • 提前谢谢你的时间。

  • 我正在尝试编写一个服务器,它通过使用唯一生成的ID来跟踪其客户端。这个想法是,如果我是管理员,并且我想从服务器上引导某人,我就为该客户机查找适当的ClientID(它实际上只是一个字符串;唯一的区别是ClientID类负责确保没有两个客户机被分配了相同的ID),然后输入一个命令,如“kick 12”(如果我想要kick的人的ClientID碰巧是12)。我认为这是可行的,因为我认为可能是通过内部使

  • 我是Flutter的初学者,我使用的是android平板电脑,它是运行在android 4.3版本上的华硕Fonepad7。我没有对项目目录中的文件进行任何更改。当我运行“flutter run”时,它返回: 我已经打开了USB调试,我正在使用Arch Linux进行编程。 有没有办法解决这个问题,还是因为我使用的是一个老版本的Android。我查过这里,上面说支持Android4.3版本。那么我