【问题标题】:Issues With JAX-RSJAX-RS 的问题
【发布时间】:2017-02-22 08:38:55
【问题描述】:

我是 JAX-RS 的新手,遇到了很多问题(这让我很奇怪地想念 SOAP)。这是我的代码的 sn-p。 getMergedPDFReport 方法应该获取一个文件并在一些处理后返回一个文件。之后我会担心客户

@GET
@Produces("application/pdf")
@Path("merge-service")
public Response getMergedPDFReport(@QueryParam(ApiParameters.WORD_DOCUMENT) File wordDocument,
                                   @QueryParam(ApiParameters.MERGE_FIELDS)Object[] fieldNames,
                                   @QueryParam(ApiParameters.MERGE_VALUES) Object [] fieldValues) {
    ResponseBuilder builder =null;
    try {
        File product = DocumentUtil.generatePDF(wordDocument, fieldNames, fieldValues);

        builder = Response.ok(product);
        builder.header("Content-Disposition", "attachment; filename=\\\"report.pdf\\\"");
    } catch (Exception e) {
        e.printStackTrace();
    }

    return builder.build();
}

我在服务器日志上收到一条警告,上面写着“没有为公共 javax.ws.rs.core.Response 类型的参数找到注入源”。我似乎不知道为什么。 2. 我使用@QueryParam 注释对吗?我应该将它用于文件类型和数组吗?我在网上看到很多关于@BeanParam、@MatrixParam 和@QueryParam 的辩论。由于我不知道前两个做什么,我决定保持简单。

任何帮助将不胜感激。

【问题讨论】:

  • 我不确定您收到的警告是否实际上与您提供的代码有关,因为您在该方法中没有Response 类型的参数。您的一般设计有几个缺陷 IMO:使用 HTTP POST 而不是 GET 来上传文件。 GET 是一种安全且幂等的操作,因此不得更改资源状态。调用的 URI 通常受框架的长度限制。如果您将编码文件作为查询参数传递,则 URI 的长度可能会变得相当大,从而增加被拒绝的可能性。

标签: java web-services jax-rs


【解决方案1】:

我认为您不能对文件使用 queryParam。您必须将 @Consumes 与多部分表单一起使用。

检查这个: http://www.javatpoint.com/jax-rs-file-upload-example

【讨论】:

  • 核心问题是,OP 正在尝试使用GET 方法发送文件。虽然根据RFC 7231 未指定随 GET 请求发出的有效负载的语义,但该规范不鼓励使用 GET 主体,以便与可能拒绝 GET 请求发出主体的旧版本保持向后兼容。此外,如果文件实际上很小,则可以使用即 base64 对其进行编码并作为查询参数传递,尽管这无论如何都不美观
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2016-08-23
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多