文件上传以及 Jersey Restful Web 服务中的其他对象

2024-01-07

我想通过上传图像和员工数据来在系统中创建员工信息。我可以使用球衣通过不同的休息时间来做到这一点。但我想在一次休息中实现这一目标。 我在下面提供了结构。请帮助我在这方面该怎么做。

@POST
@Path("/upload2")
@Consumes({MediaType.MULTIPART_FORM_DATA,MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response uploadFileWithData(
        @FormDataParam("file") InputStream fileInputStream,
        @FormDataParam("file") FormDataContentDisposition contentDispositionHeader,
        Employee emp) {

//..... business login

}

每当我尝试这样做时,我都会在 Chrome 邮递员中收到错误。下面给出了我的 Employee json 的简单结构。

{
    "Name": "John",
    "Age": 23,
    "Email": "[email protected] /cdn-cgi/l/email-protection",
    "Adrs": {
        "DoorNo": "12-A",
        "Street": "Street-11",
        "City": "Bangalore",
        "Country": "Karnataka"
    }
}

不过,我可以通过拨打两个不同的电话来做到这一点,但我想在一个休息电话中实现,以便我可以接收文件以及员工的实际数据。

请求您在这方面提供帮助。


你不能有两个Content-Type(从技术上讲,这就是我们下面要做的,但它们与多部分的每个部分分开,但主要类型是多部分)。这基本上就是您对方法的期望。你正在期待多重andjson 一起作为主要媒体类型。这Employee数据需要是多部分的一部分。所以你可以添加一个@FormDataParam("emp")为了Employee.

@FormDataParam("emp") Employee emp) { ...

这是我用于测试的类

@Path("/multipart")
public class MultipartResource {
    
    @POST
    @Path("/upload2")
    @Consumes({MediaType.MULTIPART_FORM_DATA})
    public Response uploadFileWithData(
            @FormDataParam("file") InputStream fileInputStream,
            @FormDataParam("file") FormDataContentDisposition cdh,
            @FormDataParam("emp") Employee emp) throws Exception{
        
        Image img = ImageIO.read(fileInputStream);
        JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)));
        System.out.println(cdh.getName());
        System.out.println(emp);
        
        return Response.ok("Cool Tools!").build();
    } 
}

首先,我刚刚使用客户端 API 进行了测试,以确保它可以正常工作

@Test
public void testGetIt() throws Exception {
    
    final Client client = ClientBuilder.newBuilder()
        .register(MultiPartFeature.class)
        .build();
    WebTarget t = client.target(Main.BASE_URI).path("multipart").path("upload2");

    FileDataBodyPart filePart = new FileDataBodyPart("file", 
                                             new File("stackoverflow.png"));
    // UPDATE: just tested again, and the below code is not needed.
    // It's redundant. Using the FileDataBodyPart already sets the
    // Content-Disposition information
    filePart.setContentDisposition(
            FormDataContentDisposition.name("file")
                                    .fileName("stackoverflow.png").build());

    String empPartJson
            = "{"
            + "  \"id\": 1234,"
            + "  \"name\": \"Peeskillet\""
            + "}";

    MultiPart multipartEntity = new FormDataMultiPart()
            .field("emp", empPartJson, MediaType.APPLICATION_JSON_TYPE)
            .bodyPart(filePart);
          
    Response response = t.request().post(
            Entity.entity(multipartEntity, multipartEntity.getMediaType()));
    System.out.println(response.getStatus());
    System.out.println(response.readEntity(String.class));

    response.close();
}

我刚刚创建了一个简单的Employee类与id and name场进行测试。这工作得很好。它显示图像,打印内容配置,并打印Employee object.

我对 Postman 不太熟悉,所以我把测试留到最后:-)

它似乎也工作正常,正如您可以看到的响应"Cool Tools"。但如果我们看一下印刷的Employee数据,我们会看到它是空的。这很奇怪,因为使用客户端 API 时它工作得很好。

如果我们查看预览窗口,我们就会看到问题

没有Content-Type标题为emp身体的一部分。你可以在客户端API中看到我明确设置了它

MultiPart multipartEntity = new FormDataMultiPart()
        .field("emp", empPartJson, MediaType.APPLICATION_JSON_TYPE)
        .bodyPart(filePart);

所以我想这真的只是part的完整答案。就像我说的,我对 Postman 不熟悉所以我不知道如何设置Content-Types 用于各个身体部位。这image/png因为图像是自动为我设置的图像部分(我猜它只是由文件扩展名确定)。如果你能弄清楚这一点,那么问题就应该解决了。如果您知道如何执行此操作,请将其作为答案发布。

请参阅下面的更新以获取解决方案


只是为了完整性......

  • 请参阅此处,了解有关带有 Jersey 的 MultiPart 的更多信息 https://jersey.github.io/documentation/latest/media.html#multipart.

基本配置:

依赖关系:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
    <version>${jersey2.version}</version>
</dependency>

客户端配置:

final Client client = ClientBuilder.newBuilder()
    .register(MultiPartFeature.class)
    .build();

服务器配置:

// Create JAX-RS application.
final Application application = new ResourceConfig()
    .packages("org.glassfish.jersey.examples.multipart")
    .register(MultiPartFeature.class);

如果您遇到服务器配置问题,以下帖子之一可能会有所帮助

  • Jersey 2 中的 ResourceConfig 类到底是什么? https://stackoverflow.com/q/45625925/2587435
  • 152 MULTIPART_FORM_DATA:未找到公共 javax.ws.rs.core.Response 类型参数的注入源 https://stackoverflow.com/a/30656345/2587435

UPDATE

因此,正如您从 Postman 客户端中看到的,某些客户端无法设置各个部分的 Content-Type,这包括浏览器,因为它在使用时的默认功能FormData (js).

我们不能指望客户端能够解决这个问题,所以我们能做的就是在接收数据时,在反序列化之前显式设置 Content-Type。例如

@POST
@Path("upload2")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFileAndJSON(@FormDataParam("emp") FormDataBodyPart jsonPart,
                                  @FormDataParam("file") FormDataBodyPart bodyPart) { 
     jsonPart.setMediaType(MediaType.APPLICATION_JSON_TYPE);
     Employee emp = jsonPart.getValueAs(Employee.class);
}

获取 POJO 需要做一些额外的工作,但它是比强迫客户端尝试找到自己的解决方案更好的解决方案。

另一种选择是使用 String 参数并使用任何用于将 String 反序列化为 POJO 的 JSON 库(如 Jackson ObjectMapper)。使用前一个选项,我们只是让 Jersey 处理反序列化,它将使用与所有其他 JSON 端点(可能是首选)相同的 JSON 库。


Asides

  • 有一段对话在这些评论 https://stackoverflow.com/a/42020869/2587435如果您使用与默认 HttpUrlConnection 不同的连接器,您可能会对此感兴趣。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文件上传以及 Jersey Restful Web 服务中的其他对象 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s

随机推荐

  • 2 个具有相同消费者组 ID 的 Spark Stream 作业

    我正在尝试对消费者群体进行实验 这是我的代码片段 public final class App private static final int INTERVAL 5000 public static void main String ar
  • Android 上的语音转文本

    我正在寻找创建一个具有语音转文本功能的应用程序 我知道使用 RecognizerIntent 具有这种能力 http android developers blogspot com search label Speech 20Input h
  • 在 Web api 控制器(.net core)中使用 async/await 或任务

    我有一个 net core API 它有一个控制器 可以构建要返回的聚合对象 它创建的对象由来自服务类的 3 个方法调用的数据组成 这些都是相互独立的 可以相互隔离运行 目前我正在使用任务来提高该控制器的性能 当前版本看起来像这样 Http
  • ggraph 节点颜色和图例不匹配

    这是我正在尝试绘制的 tidygraph 对象 hub plot1 A tbl graph 50 nodes and 540 edges An undirected simple graph with 2 components Node D
  • 在 R 中实现标准软件设计模式(重点是 MVC)

    目前 我正在阅读很多有关软件工程 软件设计 设计模式等的内容 来自完全不同的背景 这对我来说都是新的 令人着迷的东西 所以请耐心等待 以防我没有使用正确的技术术语描述某些方面 我最终使用了参考类 http stat ethz ch R ma
  • 如何在 ASP .NET MVC 5 中为 AspNetUser 创建 SecurityStamp

    当我在应用程序运行时通过注册操作创建用户时 应用程序用户将获得安全标记 当我通过以下方式添加用户时 if context Users Any System Diagnostics Debug WriteLine INSIDE var has
  • python:获取实际的环境变量进行修改并传递给子进程

    嗯 看来环境变量的情况在Python中并不一致 使用读取环境变量并不是什么秘密os environ or os getenv返回当前env的状态os模块已导入 仍然可以使用分配来更新环境os environ keys 但一旦我用过os pu
  • “contains”方法不适用于 ArrayList,还有其他方法吗?

    我想添加一个int 到 ArrayList 如果还没有 int 但由于某种原因 它不起作用 在这种情况下 arrlist 是ArrayList
  • 在 Android 手机的“设置”->“选择区域设置”中添加/删除语言条目

    我的问题 如何在 Android 手机的 设置 gt 语言和键盘设置 gt 选择区域设置 或 选择语言 中添加或删除语言条目源代码 level 我将提供更多关于我想要什么和我已经做了什么的细节 请原谅我如果我提供任何愚蠢的理解或信息 我对
  • 如何在 SQLAlchemy 中回滚 python 中的 dataframe.to_sql?

    engine create engine postgresql username password host 5432 database transactions to sql transactions engine if exists a
  • 在 Java 中使用 Scanner 作为全局变量是不好的做法吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 将输入扫描器 例如键盘 声明为类中的全局变量是否被认为是不好的编程实践 例如 public static Scanner input new S
  • docker安装问题安装后找不到文件

    我在 ubuntu 14 04 上安装了 docker 守护进程正在运行 但当我跑步时docker ps a 我收到这个错误 bash usr local bin docker No such file or directory 我该如何解
  • JavaFX CSS 动态样式

    在提问之前 我在网上搜索并搜索了我的问题的答案 但找不到类似的内容 我希望我的应用程序用户能够从 JavaFX ColorPicker 中选择颜色 并根据他们的选择更新整个应用程序窗口颜色 按钮颜色 字体等 我的应用程序中有很多屏幕 我真的
  • 如何打印 TensorFlow 和 Keras 损失函数中的中间变量?

    我正在编写一个自定义目标来训练 Keras 带有 TensorFlow 后端 模型 但我需要调试一些中间计算 为了简单起见 假设我有 def custom loss y pred y true diff y pred y true retu
  • 如何使用 HttpClient 改善缓慢的 DNS?

    我有一个针对特定域的请求 需要很长时间才能完成 平均 22 秒 请求本身不会返回大量数据 var httpClient new HttpClient instantiated at app start and reused var requ
  • WooCommerce 3.0 结帐期间出现“不应直接访问属性”问题

    我的日志显示了很多以下消息 order total 被错误调用 不应直接访问订单属性 此消息是在 3 0 版本中添加的 它会为订单上的每个属性重复该消息 这些消息的原因是什么 我应该采取什么措施来纠正它们 WooCommerce 3 0 修
  • C++:新手初始化列表问题

    这里是新手 我正在查看公司代码 看起来类 A 中没有成员变量 但在 A 的构造函数中它初始化了对象 B 即使类 A 不包含任何 B 类型的成员变量 或根本不包含任何成员变量 我想我还不太明白 甚至无法提出问题 所以这是怎么回事 我的直觉是
  • ASP.Net MVC - 捕获某些 URL 进行 301 重定向

    我正在从旧的网站设计转向具有新 URL 的新设计 以前的所有页面名称都是名为 PageXX html PageX html Index html 的静态文件 其中 X 是数字 我的网站现在是动态的 但我想捕获这 3 个传入 url 然后尝试
  • Java - 如何根据元素的属性分隔列表

    我有一个要对其执行操作的对象列表 然而 我首先需要将列表分成单独的列表 以便具有相同parentID的所有项目都在同一个列表中 然后分别对每个列表执行操作 原因是该操作将对象的parentID作为范围 根据此处的要求 根据元素的给定属性分隔
  • 文件上传以及 Jersey Restful Web 服务中的其他对象

    我想通过上传图像和员工数据来在系统中创建员工信息 我可以使用球衣通过不同的休息时间来做到这一点 但我想在一次休息中实现这一目标 我在下面提供了结构 请帮助我在这方面该怎么做 POST Path upload2 Consumes MediaT