Вызывается: org.apache.camel.InvalidPayloadException: - PullRequest
0 голосов
/ 16 мая 2018

Я собрал загрузчик файлов с HTTP4 для передачи данных в среды HTTP-сервера. Есть 2 системы, 1 для файлов данных CSV и 1 для доставки JSON. отправка CSV в систему CSV работает нормально. однако преобразование данных в JSON и отправка в систему JSON завершаются неудачей со следующим исключением. ошибка интуитивно понятна, однако я не знаю, что с этим делать.

Разве JSON не использует составные данные формы и должен быть определенно потоком ввода-вывода? Будучи моей первой службой HTTP, я не могу принять протокол. очевидно, система JSON не ожидает данных Multipart, я не уверен, какой должна быть отправка Json http ?? спасибо за помощь!

Caused by: org.apache.camel.InvalidPayloadException: No body available of type: java.io.InputStream but has value: org.apache.http.entity.mime.MultipartFormEntity 
Caused by: No type converter available to convert from type: org.apache.http.entity.mime.MultipartFormEntity to the required type: java.io.InputStream with value org.apache.http.entity.mime.MultipartFormEntity

вот класс загрузчика, который работает для файлов данных CSV, но не для Json?

            LOG.info("Uploading File for CustKey: " + custKey + " and Tenant: " + tenant);          

            StringBuilder authHeader = new StringBuilder("Bearer "); 
            authHeader.append(token);           
            LOG.info("Authorization: " + authHeader.toString());

            exchange.setProperty("CamelCharsetName", "UTF-8");  //"CamelCharsetName" Exchange.CHARSET_NAME
            exchange.getIn().setHeader("CamelHttpCharacterEncoding", "UTF-8");   //"CamelHttpCharacterEncoding" Exchange.HTTP_CHARACTER_ENCODING
            exchange.getIn().setHeader("CamelAcceptContentType", "application/json");  //"CamelAcceptContentType" Exchange.ACCEPT_CONTENT_TYPE
            exchange.getIn().setHeader("CamelHttpUri", uploadUrl);  //"CamelHttpUri" Exchange.HTTP_URI
            exchange.getIn().setHeader("CamelHttpMethod", "POST");  //"CamelHttpMethod" Exchange.HTTP_METHOD
            exchange.getIn().setHeader("x-ge-csvformat", "ODB");
            exchange.getIn().setHeader("Tenant", tenant);
//          exchange.getIn().setHeader("Content-Type", "multipart/form-data");  //"Content-Type" ; boundary=
            exchange.getIn().setHeader("Authorization", authHeader.toString());

            // Process the file in the exchange body
            File file = exchange.getIn().getBody(File.class);
            String fileName = (String) exchange.getIn().getHeader(Exchange.FILE_NAME);
            LOG.info("fileName: " + fileName);

            MultipartEntityBuilder entity = MultipartEntityBuilder.create();
            entity.addBinaryBody("file", file);
            entity.addTextBody("name", fileName);

            exchange.getIn().setBody(entity.build()); //*** use for CSV uploads

ЗДЕСЬ маршрут, единственная разница в маршруте - процесс JsonMapper

     <route 
        id="core.predix.upload.route"
        autoStartup="false" >
        <from uri="{{uploadEntranceEndpoint}}" />
        <process ref="customerEntitesProcessor" /> <!--  sets up the message with the customer environment entities to upload data -->
        <process ref="customerTokenProcessor" />   <!--  sets up the message with the cusotmer's token -->
        <process ref="jsonMapper" />
        <to uri="{{jsonEndpoint}}" />
        <process ref="uploadProcessor" />          <!--  conditions the message with the HTTP header info per customer env -->
        <setHeader headerName="CamelHttpUri">
            <simple>${header.UPLOADURL}?throwExceptionOnFailure=false</simple>
        </setHeader>
        <setHeader headerName="CamelHttpMethod">
            <constant>POST</constant>
        </setHeader>
        <to uri="http4://apm-timeseries-query-svc-prod.app-api.aws-usw02-pr.predix.io:443/v2/time_series/upload?throwExceptionOnFailure=false" />
        <log message="After POSTING JSON: ${body}" loggingLevel="INFO"/>    
        <to uri="{{afteruploadLocation}}" />
<!--        <log message="JSON Route: ${body}" loggingLevel="INFO"/>    -->
<!--        <to uri="{{jsonEndpoint}}" /> -->
    </route>

1 Ответ

0 голосов
/ 16 мая 2018

очевидно, отправка JSON как поток ввода-вывода.Составные данные формы Content-Type предназначены только для передачи файлов, и система ожидает, что данные Multipart формы будут иметь тип Content-Type.

, чтобы заставить это работать, я просто отправляю данные как IO Stream и меняю Content-Type на application / json.

Код изменен на, чтобы отправить Json.

            StringBuilder authHeader = new StringBuilder("Bearer "); 
            authHeader.append(token);           
            LOG.info("Authorization: " + authHeader.toString());

            exchange.setProperty("CamelCharsetName", "UTF-8");  //"CamelCharsetName" Exchange.CHARSET_NAME
            exchange.getIn().setHeader("CamelHttpCharacterEncoding", "UTF-8");   //"CamelHttpCharacterEncoding" Exchange.HTTP_CHARACTER_ENCODING
            exchange.getIn().setHeader("CamelAcceptContentType", "application/json");  //"CamelAcceptContentType" Exchange.ACCEPT_CONTENT_TYPE
            exchange.getIn().setHeader("CamelHttpUri", uploadUrl);  //"CamelHttpUri" Exchange.HTTP_URI
            exchange.getIn().setHeader("CamelHttpMethod", "POST");  //"CamelHttpMethod" Exchange.HTTP_METHOD
            exchange.getIn().setHeader("x-ge-csvformat", "ODB");
            exchange.getIn().setHeader("Tenant", tenant);
            exchange.getIn().setHeader("Content-Type", "application/json");
            exchange.getIn().setHeader("Authorization", authHeader.toString());

            //*** use for CSV uploads - uncomment all commented lines for CSV file upload
            // Process the file in the exchange body
//          File file = exchange.getIn().getBody(File.class);
//          String fileName = (String) exchange.getIn().getHeader(Exchange.FILE_NAME);
//          LOG.info("fileName: " + fileName);

//          MultipartEntityBuilder entity = MultipartEntityBuilder.create();
//          entity.addBinaryBody("file", file);
//          entity.addTextBody("name", fileName);

//          exchange.getIn().setBody(entity.build()); 
...