CXF文件上传服务:无法确定消息的边界

时间:2017-01-10 23:31:34

标签: java rest cxf attachment

我正在为一个非常简单的POST服务进行原型设计以上传文件:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("fileUpload")
public Response uploadFile(MultipartBody body) {

    //never gets to here
    System.out.println("In uploadFile");

    //TODO: implementation

    return Response.ok().build();
}

我得到了

  

org.apache.cxf.interceptor.Fault:无法确定消息的边界!

我还尝试用以下方法替换方法声明:

public Response uploadFile(List<Attachment> attachments, 
    @Context HttpServletRequest request) {

根据谷歌的一些调查结果,没有任何帮助。

我正在使用两个不同的客户端来调用此服务:chrome://poster,其中包含一个包含文件附件的字段,以及一个简单的Python脚本,如here所述。两个客户都产生相同的结果。

我应该如何更改服务实施或电话或两者,以便能够通过CXF验证并进入服务的实际主体?

<子>的参考文献:

1 个答案:

答案 0 :(得分:2)

服务器端代码看起来很好。问题是您从客户端发送数据的方式。您将数据作为有效负载中的流发送,而不是作为具有边界的附件。要快速验证,您可以通过启用CXF功能LoggingFeature或拦截器LoggingInInterceptorLoggingoutInterceptor来启用日志记录请求和响应。在日志中,如果您看到数据来自Payload,那么您将以流形式发送数据,在这种情况下您需要更改发送数据的方式,否则您可以将消耗更改为application / octetstream并直接使用inputstream接收数据。

我不知道您使用的工具,但我使用Chrome扩展程序postman来测试REST服务。如果您安装扩展程序并启动该应用程序。

您可以使用以下方法上传文件。

enter image description here

  1. 从下拉列表中将方法类型更改为POST
  2. 输入URL
  3. 选择标签Body
  4. 选择Form-Data单选按钮
  5. 在最右边的行中,从下拉菜单中选择file。如图所示。
  6. 选择要上传的文件。
  7. 可选输入multipart键。
  8. 最后点击发送。
  9. 我们可以通过选择二进制单选按钮并上传文件来重现您的错误,如下所示。

    enter image description here