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

Spring+JPA+WebMVC:返回JPEG

龙永福
2023-03-14

我有一个Spring应用程序,它使用带有WebMVC的JPA存储库,我正在尝试扩展它以支持图像。我可以上传图像并将它们存储在服务器端,但当涉及到用客户端实际检索图像时,我实际上无法成功发送响应。

首先,这是我公开的客户端API:

@Streaming
@GET(PATIENT_EXTRA_PATH + "/{id}" + GET_IMAGE_RELPATH)
public Response getImageData(@Path(ID) long id, @Query(IMAGE_FILE) String imageFile);

下面是我第一次尝试实现:

@RequestMapping(value = PainManagementSvcApi.PATIENT_EXTRA_PATH + "/{id}" +
        PainManagementSvcApi.GET_IMAGE_RELPATH, method = RequestMethod.GET,
        produces = MediaType.IMAGE_JPEG_VALUE)
public HttpServletResponse getImageData(@PathVariable(PainManagementSvcApi.ID) long id,
        @RequestParam(PainManagementSvcApi.IMAGE_FILE) String imageFile,
        Principal principal, HttpServletResponse response) {
    // Do some stuff to ensure image availability and access

    // All of this works
    response.setContentType("image/jpeg");
    imageFileManager.copyImageData(imageFile, response.getOutputStream());
    response.setStatus(HttpServletResponse.SC_OK);

    // Return the response
    return response;
}

但是,该方法在测试时会产生以下异常:

ServletException:无法解析名为“dispatcher servlet”的servlet中名为“extra/1/image”的视图

@RequestMapping(value = PainManagementSvcApi.PATIENT_EXTRA_PATH + "/{id}" +
        PainManagementSvcApi.GET_IMAGE_RELPATH, method = RequestMethod.GET,
        produces = MediaType.IMAGE_JPEG_VALUE)
public HttpServletResponse getImageData(@PathVariable(PainManagementSvcApi.ID) long id,
        @RequestParam(PainManagementSvcApi.IMAGE_FILE) String imageFile,
        Principal principal, HttpServletResponse response) {
    // Same code as before
}

但是,添加@responsebody与我的一个工作视频示例(该示例使用Spring,但不使用JPA存储库或WebMVC)发生冲突,并产生以下异常:

org.springframework.web.HttpMediatypeNotAcceptableException:找不到可接受的表示形式

除了使用响应返回值外,我还尝试返回FileSystemResource,但这会产生如下所示的JSON错误:

应为BEGIN_OBJECT,但在第1行第1列是字符串

因为我只是试图返回一个图像,所以我不会认为需要JSON,但我不知道如何删除JSON头信息,因为生成setcontenttype显然没有任何影响。此外,由于图像可能很大,我认为@streaming注释是必要的,并且只能与响应一起使用。

如果有用的话,下面是我用来测试应用程序的代码

Response response = user.getImageData(extra.getId(), fileName);
assertEquals(HttpStatus.SC_OK, response.getStatus());
InputStream imageStream = response.getBody().in();
byte[] retrievedFile = IOUtils.toByteArray(imageStream);
byte[] originalFile = IOUtils.toByteArray(new FileInputStream(images[index++]));
assertTrue(Arrays.equals(originalFile, retrievedFile));

共有1个答案

全心思
2023-03-14

尝试将ByteArrayHttpMessageConverter添加到Spring MVC安装程序中的转换器中,并将方法的返回类型更改为Byte[]。另外,不要忘记添加@ResponseBody注释。

 类似资料:
  • spring-webmvc-pac4j 项目是 Spring Web MVC(带或不带 Spring Boot)Web 应用程序的简单而强大的安全库,包含 OAuth, CAS, SAML, OpenID Connect, LDAP, JWT 这些功能。 它支持身份验证和授权,还支持注销和高级功能,如会话固定和 CSRF 保护,它基于 Java 8、Spring Web MVC 5和 pac4j 安全引擎 v3。

  • 我试图异步保存实体并返回结果的未来,但我遇到了以下问题: 测试返回失败,我得到预期结果: 如何将我的存储库实现为异步存储库以及如何测试它? 哪种方法性能更好:1。从存储库2返回未来。是否在ExecutorService中以可调用的方式运行存储库方法?

  • 我正在用jpa处理spring boot,我尝试使用onetomany,由于某种原因,当我尝试在postman上发送请求时,它创建了我的父对象,但没有使用子外键,因此我得到了null。 还有一件事:有一次我玩了我的代码,不知怎么的,我让它工作了,但它只成功了一次,现在它不再工作了。我试图在网上学习很多教程,但没有一个帮助我解决这个问题。

  • 以下依赖项之间有什么区别? vs 如果我单独包括spring webmvc,则隐式添加spring web。 我们什么时候应该单独使用?

  • 我有一个带有嵌入Id的类。当我尝试使用Jpa存储库进行搜索时,它只返回一个空对象。问题似乎出在嵌入式Id中,因为我用一个没有这个Id的类进行了测试,结果很好。 当我针对数据库进行测试时,JPA在控制台中输出的查询工作正常。 并且没有输出错误。 编辑:数据库中有数据 EDIT2:添加了equals和hashcode。 编辑3:findAll方法有效。 实体 嵌入ID 存储库 服务 正如你所看到的,我

  • 我试图使用JPA findAll获取所有记录。如果我在终端中运行相同的查询,结果会得到一些行,但不是通过JPA。我在stackoverflow上尝试了其他答案,但都不起作用。我尝试添加公共getter和setter,尽管我假设这是通过注释完成的。 型号类别: 服务等级: 编辑:添加存储库代码: