java - Apache CXF 拦截器覆盖内容类型

标签 java web-services rest file-upload cxf

我有一个邮政服务,仅接受文件上传的 POST 请求:

@POST
@Path("uploadfile")
@Consumes({ "*/*" })
@Produces({ "*/*" })
public Response uploadFile(@Context UriInfo uri, @Context HttpHeaders httpHeaders, MultipartBody multipartBody);

如果前端客户端设置了“错误”的 Content-Type,则会收到 415 响应错误。使用 InInterceptor 我想将消息重新设置为 MultipartBody:

@Override
public void handleMessage(Message message) throws Fault {
    System.out.println(message);
}

此处消息类型为org.apache.cxf.message.XMLMessage 。如何更改此设置,使我的 uploadFile 方法能够通过 MultipartBody 接受此请求?

PS: 前端客户端未知且无法更改,目前已经发送错误的内容类型...

我尝试过更改内容类型:

@Override
public void handleMessage(Message message) throws Fault {
    Map<String,String> map = (Map<String, String>)message.get(Message.PROTOCOL_HEADERS);
    message.put(Message.CONTENT_TYPE, "multipart/form-data");
    map.put("content-type", "[multipart/form-data]");
    message.put(Message.PROTOCOL_HEADERS, map);
}

但后来我得到:

java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: java.lang.String cannot be cast to java.util.List
    at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:116)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:333)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)

最佳答案

好吧,我发现我选错了......

Map<String,List> map = (Map<String, List>)message.get(Message.PROTOCOL_HEADERS);

不是

Map<String,String> map = (Map<String, String>)message.get(Message.PROTOCOL_HEADERS);

所以现在它可以工作了......

@Override
public void handleMessage(Message message) throws Fault {
    Map<String,List> map = (Map<String, List>)message.get(Message.PROTOCOL_HEADERS);
    message.put(Message.CONTENT_TYPE, "multipart/form-data");
    map.put("content-type", Collections.singletonList("multipart/form-data"));
    message.put(Message.PROTOCOL_HEADERS, map);
}

关于java - Apache CXF 拦截器覆盖内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20331344/

相关文章:

java - JSONObject Java 相当于 Objective C

java - reactor.netty.http.server.AccessLog 产生 LoggingEvent 而不是 AccessEvent

java - 为什么重写在 JAVA 中的工作方式与 C++ 有所不同?

java - 我通过浏览器访问下面的 webservice 方法时遇到异常

web-services - 为什么我们需要 RESTful Web 服务?

c# - Amazon S3 REST API 403 错误 c#

java - 在 Hashmap 中将 JsonAnySetter 和 JsonAnyGetter 与 ArrayList 一起使用

java - 使用 Apache Axis 通过 SSL 调用客户端 Web 服务

android - 使用 Android 从云端检索数据

node.js - 我应该使用 REST API 还是 Socket.io 作为地理定位应用程序?