我正在制作一个非常简单的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) {


根据Google的一些发现,没有帮助。

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

为了能够通过CXF验证并进入服务的实际主体,应如何更改我的服务实现或调用或同时更改两者?

参考资料:


JAX-RS : Support for Multiparts
Apache CXF: JAX-RS Restful web service for uploading/downloading Text file + Java client

最佳答案

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



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

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

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


从下拉列表中将“方法类型”更改为POST
输入URL
选择选项卡Body
选择Form-Data单选按钮
在最右边的行中,从下拉列表中选择file。如图所示。
选择要上传的文件。
可选输入多部分密钥。
最后单击发送。




我们可以通过选择二进制单选按钮并上传文件来重现您的错误,如下所示。

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

关于java - CXF文件上传服务:无法确定消息的边界,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41580304/

10-12 00:22
查看更多