RestEasy - UnsupportedMediaTypeException:无法使用内容类型
问题描述:
我有一个应该接收混合MIME内容的弹簧MVC REST服务。如果我改变@Consumes注释,以便它使用@Consumes("multipart/form-data")
而不是@Consumes("multipart/mixed")
然后它RestEasy - UnsupportedMediaTypeException:无法使用内容类型
17:18:58,456 WARN [org.jboss.resteasy.core.SynchronousDispatcher] (http--127.0.0.1-8080-1) Failed executing POST services/createMime: org.jboss.resteasy.spi.UnsupportedMediaTypeException: Cannot consume content type
at org.jboss.resteasy.core.registry.Segment.match(Segment.java:112) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.core.registry.SimpleSegment.matchSimple(SimpleSegment.java:33) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:327) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.core.registry.SimpleSegment.matchSimple(SimpleSegment.java:44) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:327) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:374) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:367) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:251) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:173) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:118) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) [resteasy-jaxrs-2.2.1.GA.jar:]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) [resteasy-jaxrs-2.2.1.GA.jar:]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final]
at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final]
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:49) [jboss-as-jpa-7.0.2.Final.jar:7.0.2.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
at java.lang.Thread.run(Thread.java:619) [:1.6.0_07]
:控制器被定义为
@POST
@Path("/createMime")
@Consumes("multipart/mixed")
@ResponseStatus(HttpStatus.OK)
public String createMime(@Context ServletContext servletContext, MultipartInput input) throws MyRestException {
logger.info("Processing /createMime");
return "TEST";
}
当我测试上面我碰到下面的错误。我需要做些什么来使它与多部分/混合工作?
以下是我如何使用客户端将内容发送到REST服务。
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://localhost:8080/MyRestService/rest/services/createMime");
Scanner scanner =
new Scanner(new File("header.xml")).useDelimiter("\\Z");
String messageHeader = scanner.next();
scanner.close();
FileBody bin = new FileBody(new File("myImage.jpg"));
StringBody header = new StringBody(messageHeader.toString());
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("header", header);
reqEntity.addPart("payload", bin);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
我一直在挣扎与此相当长的一段时间,所以任何帮助将不胜感激。
感谢
答
尝试使用javax.ws.rs.core.MediaType字符串中,而不是把。它避免了可能的输入错误
答
您是否检查了请求的内容类型?我相信你的客户发送内容到REST
服务是发布multipart/form-data
请求。
要了解如何发送multipart/mixed request
,您应该查看multipart
内容类型的文档http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html,第7.2.1节建议应指定和使用boundary
。
基本上,你需要按照下面的要求做出multipart/mixed
请求。
包括在报头中
Content-Type: multipart/mixed;boundary=gc0p4Jq0M2Yt08jU534c0p
的边界中的每个请求的部分的应具有--boundary
--gc0p4Jq0M2Yt08jU534c0p
最后部分应包括--boundary--
--gc0p4Jq0M2Yt08jU534c0p--
你是否意识到你的客户端实际上是在发送'multipart/form-data'请求?问题出在客户端。 – BalusC 2012-02-18 17:37:25
@BalusC - 这很有趣。你怎么知道这是,我如何发送多部分/混合请求? – ziggy 2012-02-18 17:45:52
另请注意,您无法使用'multipart/mixed'上传文件内容。 – Perception 2012-02-18 17:46:31