Apache camel 无法通过apache camel http将文件发送到rest webservice

Apache camel 无法通过apache camel http将文件发送到rest webservice,apache-camel,Apache Camel,我不熟悉Camel,在通过Camel-http向webservice发送文件时遇到了一个问题。 我有一个RESTWeb服务,它使用多部分表单数据类型内容并接受作为表单数据一部分的输入。 当我通过camel发送文件和表单参数时,在camel控制台上会出现以下错误: Stacktrace -----------------------------------------------------------------------------------------------------------

我不熟悉Camel,在通过Camel-http向webservice发送文件时遇到了一个问题。
我有一个RESTWeb服务,它使用多部分表单数据类型内容并接受作为表单数据一部分的输入。 当我通过camel发送文件和表单参数时,在camel控制台上会出现以下错误:

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
org.apache.camel.component.http.HttpOperationFailedException: HTTP operation failed invoking http://localhost:8080/JAX_RS_Application/resource/restwb/upload with statusCode: 415
    at org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:230)
    at org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:156)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:129)
    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.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:435)
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:211)
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:175)
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
我在服务器端控制台上得到的错误如下:

SEVERE: MessageBodyReader not found for media type=application/octet-stream, typ
e=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=clas
s org.glassfish.jersey.media.multipart.FormDataMultiPart.
import java.io.IOException;
import java.io.InputStream;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

import org.apache.commons.io.IOUtils;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

@Path("/restwb") 
public class FileResource {
    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public String uploadFile(@FormDataParam("username") String username,@FormDataParam("password") String password,@FormDataParam("upload") InputStream is) {
            String output ="Hi "+username+" your password is "+password;
            output=output+IOUtils.LINE_SEPARATOR +IOUtils.LINE_SEPARATOR;
            output=output+"Output :"+IOUtils.LINE_SEPARATOR+"------------------------------------------------------------------------------"+IOUtils.LINE_SEPARATOR;
            try {
                output=output+IOUtils.toString(is)+IOUtils.LINE_SEPARATOR+IOUtils.LINE_SEPARATOR;
                output=output+"==================================================================================================="+IOUtils.LINE_SEPARATOR+IOUtils.LINE_SEPARATOR;
                System.out.println("Output :"+output);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return output;
    }
}
import org.apache.camel.*;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.spi.Synchronization;
import org.apache.camel.spi.UnitOfWork;
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.james.mime4j.message.Multipart;
import org.apache.log4j.Logger;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * Created by Manish.Pillai on 7/16/2015.
 */
public class LoggingMain {

    private static final Logger logger =Logger.getLogger(LoggingMain.class);

    public static void main(String[] args) throws  Exception{
        CamelContext camelContext =new DefaultCamelContext();
        try {
            camelContext.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("file:C:\\temp?delay=5000&move=processed&moveFailed=error&antExclude=**/processed/**,**/error/**")
                            .process(new Processor() {
                                public void process(Exchange exchange) throws Exception {
                                    exchange.getContext().getTypeConverterRegistry().addTypeConverter(HttpEntity.class,InputStream.class,new InputStreamToHttpEntityConvertor());
                                    exchange.getOut().setBody(exchange.getIn().getBody(),HttpEntity.class);
                                }
                            })
                            .to("http://localhost:8080/JAX_RS_Application/resource/restwb/upload");
                }
            });

            camelContext.getRestConfiguration();
            camelContext.start();
            Thread.sleep(5000);
            camelContext.stop();

        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }

    static class InputStreamToHttpEntityConvertor implements TypeConverter {

        public boolean allowNull() {
            return false;
        }

        public <T> T convertTo(Class<T> type, Object value) throws TypeConversionException {
            Exchange exchange=(Exchange)value;

            StringBody username = new StringBody("username", ContentType.MULTIPART_FORM_DATA);
            StringBody password = new StringBody("password", ContentType.MULTIPART_FORM_DATA);
            MultipartEntityBuilder multipartEntityBuilder=MultipartEntityBuilder.create();
            multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            multipartEntityBuilder.addPart("upload", new FileBody(exchange.getIn().getBody(File.class), ContentType.MULTIPART_FORM_DATA, (String) exchange.getIn().getHeader(Exchange.FILE_NAME)));
            multipartEntityBuilder.addPart("username",username);
            multipartEntityBuilder.addPart("password",password);
            return (T)multipartEntityBuilder.build();
        }

        public <T> T convertTo(Class<T> aClass, Exchange exchange, Object o) throws TypeConversionException {
            return convertTo(aClass,o);
        }

        public <T> T mandatoryConvertTo(Class<T> type, Object value) throws TypeConversionException, NoTypeConversionAvailableException {
            return convertTo(type,value);
        }

        public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange, Object value) throws TypeConversionException, NoTypeConversionAvailableException {
            return convertTo(type,value);
        }

        public <T> T tryConvertTo(Class<T> type, Object value) {
            return convertTo(type,value);
        }

        public <T> T tryConvertTo(Class<T> type, Exchange exchange, Object value) {
            return convertTo(type,value);
        }
    }

}
通过jersey创建的Rest web服务的代码片段如下所示:

SEVERE: MessageBodyReader not found for media type=application/octet-stream, typ
e=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=clas
s org.glassfish.jersey.media.multipart.FormDataMultiPart.
import java.io.IOException;
import java.io.InputStream;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

import org.apache.commons.io.IOUtils;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

@Path("/restwb") 
public class FileResource {
    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public String uploadFile(@FormDataParam("username") String username,@FormDataParam("password") String password,@FormDataParam("upload") InputStream is) {
            String output ="Hi "+username+" your password is "+password;
            output=output+IOUtils.LINE_SEPARATOR +IOUtils.LINE_SEPARATOR;
            output=output+"Output :"+IOUtils.LINE_SEPARATOR+"------------------------------------------------------------------------------"+IOUtils.LINE_SEPARATOR;
            try {
                output=output+IOUtils.toString(is)+IOUtils.LINE_SEPARATOR+IOUtils.LINE_SEPARATOR;
                output=output+"==================================================================================================="+IOUtils.LINE_SEPARATOR+IOUtils.LINE_SEPARATOR;
                System.out.println("Output :"+output);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return output;
    }
}
import org.apache.camel.*;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.spi.Synchronization;
import org.apache.camel.spi.UnitOfWork;
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.james.mime4j.message.Multipart;
import org.apache.log4j.Logger;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * Created by Manish.Pillai on 7/16/2015.
 */
public class LoggingMain {

    private static final Logger logger =Logger.getLogger(LoggingMain.class);

    public static void main(String[] args) throws  Exception{
        CamelContext camelContext =new DefaultCamelContext();
        try {
            camelContext.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("file:C:\\temp?delay=5000&move=processed&moveFailed=error&antExclude=**/processed/**,**/error/**")
                            .process(new Processor() {
                                public void process(Exchange exchange) throws Exception {
                                    exchange.getContext().getTypeConverterRegistry().addTypeConverter(HttpEntity.class,InputStream.class,new InputStreamToHttpEntityConvertor());
                                    exchange.getOut().setBody(exchange.getIn().getBody(),HttpEntity.class);
                                }
                            })
                            .to("http://localhost:8080/JAX_RS_Application/resource/restwb/upload");
                }
            });

            camelContext.getRestConfiguration();
            camelContext.start();
            Thread.sleep(5000);
            camelContext.stop();

        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }

    static class InputStreamToHttpEntityConvertor implements TypeConverter {

        public boolean allowNull() {
            return false;
        }

        public <T> T convertTo(Class<T> type, Object value) throws TypeConversionException {
            Exchange exchange=(Exchange)value;

            StringBody username = new StringBody("username", ContentType.MULTIPART_FORM_DATA);
            StringBody password = new StringBody("password", ContentType.MULTIPART_FORM_DATA);
            MultipartEntityBuilder multipartEntityBuilder=MultipartEntityBuilder.create();
            multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            multipartEntityBuilder.addPart("upload", new FileBody(exchange.getIn().getBody(File.class), ContentType.MULTIPART_FORM_DATA, (String) exchange.getIn().getHeader(Exchange.FILE_NAME)));
            multipartEntityBuilder.addPart("username",username);
            multipartEntityBuilder.addPart("password",password);
            return (T)multipartEntityBuilder.build();
        }

        public <T> T convertTo(Class<T> aClass, Exchange exchange, Object o) throws TypeConversionException {
            return convertTo(aClass,o);
        }

        public <T> T mandatoryConvertTo(Class<T> type, Object value) throws TypeConversionException, NoTypeConversionAvailableException {
            return convertTo(type,value);
        }

        public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange, Object value) throws TypeConversionException, NoTypeConversionAvailableException {
            return convertTo(type,value);
        }

        public <T> T tryConvertTo(Class<T> type, Object value) {
            return convertTo(type,value);
        }

        public <T> T tryConvertTo(Class<T> type, Exchange exchange, Object value) {
            return convertTo(type,value);
        }
    }

}
我的驼峰配置如下:

SEVERE: MessageBodyReader not found for media type=application/octet-stream, typ
e=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=clas
s org.glassfish.jersey.media.multipart.FormDataMultiPart.
import java.io.IOException;
import java.io.InputStream;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

import org.apache.commons.io.IOUtils;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

@Path("/restwb") 
public class FileResource {
    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public String uploadFile(@FormDataParam("username") String username,@FormDataParam("password") String password,@FormDataParam("upload") InputStream is) {
            String output ="Hi "+username+" your password is "+password;
            output=output+IOUtils.LINE_SEPARATOR +IOUtils.LINE_SEPARATOR;
            output=output+"Output :"+IOUtils.LINE_SEPARATOR+"------------------------------------------------------------------------------"+IOUtils.LINE_SEPARATOR;
            try {
                output=output+IOUtils.toString(is)+IOUtils.LINE_SEPARATOR+IOUtils.LINE_SEPARATOR;
                output=output+"==================================================================================================="+IOUtils.LINE_SEPARATOR+IOUtils.LINE_SEPARATOR;
                System.out.println("Output :"+output);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return output;
    }
}
import org.apache.camel.*;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.spi.Synchronization;
import org.apache.camel.spi.UnitOfWork;
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.james.mime4j.message.Multipart;
import org.apache.log4j.Logger;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * Created by Manish.Pillai on 7/16/2015.
 */
public class LoggingMain {

    private static final Logger logger =Logger.getLogger(LoggingMain.class);

    public static void main(String[] args) throws  Exception{
        CamelContext camelContext =new DefaultCamelContext();
        try {
            camelContext.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("file:C:\\temp?delay=5000&move=processed&moveFailed=error&antExclude=**/processed/**,**/error/**")
                            .process(new Processor() {
                                public void process(Exchange exchange) throws Exception {
                                    exchange.getContext().getTypeConverterRegistry().addTypeConverter(HttpEntity.class,InputStream.class,new InputStreamToHttpEntityConvertor());
                                    exchange.getOut().setBody(exchange.getIn().getBody(),HttpEntity.class);
                                }
                            })
                            .to("http://localhost:8080/JAX_RS_Application/resource/restwb/upload");
                }
            });

            camelContext.getRestConfiguration();
            camelContext.start();
            Thread.sleep(5000);
            camelContext.stop();

        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }

    static class InputStreamToHttpEntityConvertor implements TypeConverter {

        public boolean allowNull() {
            return false;
        }

        public <T> T convertTo(Class<T> type, Object value) throws TypeConversionException {
            Exchange exchange=(Exchange)value;

            StringBody username = new StringBody("username", ContentType.MULTIPART_FORM_DATA);
            StringBody password = new StringBody("password", ContentType.MULTIPART_FORM_DATA);
            MultipartEntityBuilder multipartEntityBuilder=MultipartEntityBuilder.create();
            multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            multipartEntityBuilder.addPart("upload", new FileBody(exchange.getIn().getBody(File.class), ContentType.MULTIPART_FORM_DATA, (String) exchange.getIn().getHeader(Exchange.FILE_NAME)));
            multipartEntityBuilder.addPart("username",username);
            multipartEntityBuilder.addPart("password",password);
            return (T)multipartEntityBuilder.build();
        }

        public <T> T convertTo(Class<T> aClass, Exchange exchange, Object o) throws TypeConversionException {
            return convertTo(aClass,o);
        }

        public <T> T mandatoryConvertTo(Class<T> type, Object value) throws TypeConversionException, NoTypeConversionAvailableException {
            return convertTo(type,value);
        }

        public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange, Object value) throws TypeConversionException, NoTypeConversionAvailableException {
            return convertTo(type,value);
        }

        public <T> T tryConvertTo(Class<T> type, Object value) {
            return convertTo(type,value);
        }

        public <T> T tryConvertTo(Class<T> type, Exchange exchange, Object value) {
            return convertTo(type,value);
        }
    }

}
import org.apache.camel.*;
导入org.apache.camel.builder.RouteBuilder;
导入org.apache.camel.impl.DefaultCamelContext;
导入org.apache.camel.spi.Synchronization;
导入org.apache.camel.spi.UnitOfWork;
导入org.apache.http.HttpEntity;
导入org.apache.http.entity.ContentType;
导入org.apache.http.entity.mime.HttpMultipartMode;
导入org.apache.http.entity.mime.MultipartEntityBuilder;
导入org.apache.http.entity.mime.content.FileBody;
导入org.apache.http.entity.mime.content.StringBody;
导入org.apache.james.mime4j.message.Multipart;
导入org.apache.log4j.Logger;
导入java.io.File;
导入java.io.InputStream;
导入java.util.List;
导入java.util.Map;
/**
*由Manish.Pillai于2015年7月16日创作。
*/
公共类日志{
私有静态最终记录器Logger=Logger.getLogger(LoggingMain.class);
公共静态void main(字符串[]args)引发异常{
CamelContext CamelContext=新的DefaultCamelContext();
试一试{
camelContext.addRoutes(新RouteBuilder(){
@凌驾
public void configure()引发异常{
从(“文件:C:\\temp?延迟=5000&move=processed&moveFailed=error&antExclude=***/processed/**,***/error/**”)
.进程(新处理器(){
公共作废进程(Exchange)引发异常{
exchange.getContext().getTypeConverterRegistry().addTypeConverter(HttpEntity.class,InputStream.class,new InputStreamToHttpEntityConvertor());
exchange.getOut().setBody(exchange.getIn().getBody(),HttpEntity.class);
}
})
.至(”http://localhost:8080/JAX_RS_Application/resource/restwb/upload");
}
});
camelContext.getRestConfiguration();
camelContext.start();
睡眠(5000);
camelContext.stop();
}捕获(例外e){
logger.error(例如getMessage());
}
}
静态类InputStreamToHttpEntityConvertor实现类型转换器{
公共布尔allowNull(){
返回false;
}
公共T convertTo(类类型,对象值)抛出TypeConversionException{
交换=(交换)值;
StringBody用户名=新的StringBody(“用户名”,ContentType.MULTIPART\u表单\u数据);
StringBody密码=新的StringBody(“密码”,ContentType.MULTIPART\u FORM\u DATA);
MultipartEntityBuilder MultipartEntityBuilder=MultipartEntityBuilder.create();
multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_兼容);
multipartEntityBuilder.addPart(“上载”,新的文件体(exchange.getIn().getBody(File.class),ContentType.MULTIPART_表单_数据,(字符串)exchange.getIn().getHeader(exchange.File_名称));
multipartEntityBuilder.addPart(“用户名”,用户名);
multipartEntityBuilder.addPart(“密码”,password);
返回(T)multipartEntityBuilder.build();
}
public T convertTo(类aClass、Exchange、Object o)抛出TypeConversionException{
返回到(aClass,o);
}
public T mandatoryConvertTo(类类型,对象值)抛出TypeConversionException,NotTypeConversionAvailableException{
返回convertTo(类型、值);
}
public T mandatoryConvertTo(类类型、交换、对象值)抛出TypeConversionException,而不是TypeConversionAvailableException{
返回convertTo(类型、值);
}
公共T tryConvertTo(类类型、对象值){
返回convertTo(类型、值);
}
公共T tryConvertTo(类类型、交换、对象值){
返回convertTo(类型、值);
}
}
}

任何线索都会有帮助。

好吧,代码中有几点可以改进

首先,由于您使用的是MultipartEntityBuilder,这意味着您使用的是Apache的HttpClient版本4.3+,因此为了获得最佳兼容性,您应该使用它

第三,在这样一个小的例子中,您实际上不需要使用转换器,您可以这样做:

public class LoggingMain {

    private static final Logger logger = Logger.getLogger(LoggingMain.class);

    public static void main(String[] args) throws Exception {
        CamelContext camelContext = new DefaultCamelContext();
        try {
            camelContext.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("file:C:\\temp?delay=5000&move=processed&moveFailed=error&antExclude=**/processed/**,**/error/**")
                            .process(new Processor() {
                                public void process(Exchange exchange) throws Exception {
                                    StringBody username = new StringBody("username", ContentType.MULTIPART_FORM_DATA);
                                    StringBody password = new StringBody("password", ContentType.MULTIPART_FORM_DATA);

                                    MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
                                    multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
                                    multipartEntityBuilder.addPart("username", username);
                                    multipartEntityBuilder.addPart("password", password);

                                    String filename = (String) exchange.getIn().getHeader(Exchange.FILE_NAME);
                                    File file = exchange.getIn().getBody(File.class);
                                    multipartEntityBuilder.addPart("upload", new FileBody(file, ContentType.MULTIPART_FORM_DATA, filename));

                                    exchange.getIn().setBody(multipartEntityBuilder.build());
                                }
                            })
                            .to("http4://localhost:8080/JAX_RS_Application/resource/restwb/upload");
                }
            });

            camelContext.getRestConfiguration();
            camelContext.start();
            Thread.sleep(5000);
            camelContext.stop();

        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }

}

我希望这有帮助

谢谢你的回复!!!我已经尝试过将内容类型设置为multipart/form data,这会给我带来400个错误…其次,将body设置为HttpEntity会给我带来一个错误,它说。。找不到用于将MultipartFormEntity转换为InputStream的转换器,因此我必须创建一个转换器。。。。是的,我同意你的观点,httpclient builder是http4最受支持的,我会尝试一下……我提供的示例对我来说很好,你可以自己尝试:而且必须将内容类型设置为多部分/表单数据,因为你的服务只使用该类型,任何其他类型都会导致错误。虽然由于您使用的是多部分实体,我想可以忽略它。在使用Camel之前,您实际上已经尝试过使用一些rest工具或SOAPUI或类似工具发送它,以验证一切是否正常?是的。。我用邮递员测试了这项服务,效果很好。