如何使用apache-camel restlet组件处理文件上传?

时间:2015-10-14 10:41:05

标签: apache-camel

我有一个前端Web应用程序,它通过一个简单的表单上传文件和其他数据:

   <form action="/document/invoice/entity/777" enctype="multipart/form-data">
     <input name="file" type="file">
     <input name="userId">
     <button>Upload File</button>
    </form>

并且服务器端必须是apache-camel路由,使用restlet组件处理上传的数据,类似于:

<restContext id="myApi" xmlns="http://camel.apache.org/schema/spring">

    <rest path="/document">
        <post uri="/{documentType}/entity/{entityId}" outType="documentService.Result"
             consumes="multipart/form-data" produces="application/json">
            <route>
                <to uri="bean:documentService?method=validate(${body.file}, ${body.userId}, ${header.documentType}, ${header.entityId})"/>
            </route>
        </post>
    </rest>

</restContext>

使用此配置我收到此错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
    at com.google.gson.Gson.fromJson(Gson.java:822)
    at com.google.gson.Gson.fromJson(Gson.java:748)
    at org.apache.camel.component.gson.GsonDataFormat.unmarshal(GsonDataFormat.java:105)
    at org.apache.camel.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:67)
    at org.apache.camel.processor.binding.RestBindingProcessor.process(RestBindingProcessor.java:175)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:87)
    at org.apache.camel.component.http.CamelServlet.service(CamelServlet.java:144)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:387)
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:183)
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
    at com.google.gson.Gson.fromJson(Gson.java:810)
    ... 36 more

如何将文件和其他数据上传到apache-camel rest端点?

2 个答案:

答案 0 :(得分:0)

对于如何将数据传递给camel的restlet组件,您看起来有一些配置问题。我建议您阅读camel网站上的restlet文档:http://camel.apache.org/restlet.html如果您仍然遇到问题,请链接到使用camel实现restlet服务器的完整项目: http://www.ofbizian.com/2012/02/apache-camel-rest-example.html

如果您在检查这些资源后仍然遇到问题,请澄清该异常是来自客户端还是服务器端。

答案 1 :(得分:0)

您正在尝试上传某些数据或文件,但根据错误预期JSON数据,&#34; com.google.gson.JsonSyntaxException&#34;而是它获得了别的东西。您确定根据发送的内容正确配置了后端部分吗?