mule flow для создания и загрузки файлов

Если у меня есть какой-то компонент java или rest в потоках mule, mule не создает и не загружает файл.

     <flow name="qbiif" doc:name="qbiif">
            <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="9192" doc:name="HTTP" path="QBRest"/>
            <jersey:resources doc:name="REST">
                <component class="com.trinet.rest.RestIntegration"/>
            </jersey:resources>
            <component doc:name="Java">
                <singleton-object class="com.mycompany.iif.java.AppendData"/>
            </component>
            <set-payload value="Hello" doc:name="Set Payload"/>
            <set-property propertyName="mimeType" value="text/csv" doc:name="Property"/>
            <set-property propertyName="Content-Disposition" value="attachment;filename=QuickbooksAccountsJava.iif" doc:name="Property"/>
            <logger message="final output==#[payload]" level="INFO" doc:name="Logger"/>  
</flow>

Если у меня нет компонента java / rest, он загружает файл, как показано ниже.

<flow name="qbiif" doc:name="qbiif">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="9192" doc:name="HTTP" path="QBRest"/>      
        <set-payload value="Hello" doc:name="Set Payload"/>
        <set-property propertyName="mimeType" value="text/csv" doc:name="Property"/>
        <set-property propertyName="Content-Disposition" value="attachment;filename=QuickbooksAccountsJava.iif" doc:name="Property"/>
</flow>

Мне нужно загрузить файл с содержимым из данных полезной нагрузки java.

Я перешел по этой ссылке, но без изменений.

ИЗМЕНИТЬ

Компонент отдыха:

@Path("/")
public class RestIntegration {

    @POST
    @Path("/post/{id1}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response postOperation(@PathParam("id1")String id, String cont) throws Exception{
                return Response.status(200).entity(cont).build();
    }
    }



Java Component




 public class AppendData implements Serializable {
        public String appendData(@Payload String str) throws IOException, ParseException{
            JSONParser jsonParser = new JSONParser();
            Object jsonObjectInstance = jsonParser.parse(new StringReader(str));
            StringBuilder stringBuilder = new StringBuilder();
            buildHeaders(stringBuilder);
            if (jsonObjectInstance instanceof JSONObject) {
                JSONObject jObject = (JSONObject) jsonObjectInstance;
                buildContent(stringBuilder,jObject);
            }else{
                JSONArray jsonArray = (JSONArray) jsonObjectInstance;
                for(int i=0; i<jsonArray.size(); i++ ){
                    JSONObject jsonObject= (JSONObject) jsonArray.get(i);
                    buildContent(stringBuilder,jsonObject);
                }
            }
            buildFooter(stringBuilder);
            return (stringBuilder.toString());
        }
    private void buildContent(StringBuilder stringBuilder, JSONObject jsonObject) {
            stringBuilder.append("ANS"+"\t");
    }
    private void buildHeaders(StringBuilder stringBuilder) {
            stringBuilder.append("!TRNS \t Account \t Date \t\t Amount \t Description \t Memo \n");
        }
        private void buildFooter(StringBuilder stringBuilder) {
            stringBuilder.append("ENDANNS");
        }
    }

Если нет компонента Java / Rest, я могу загрузить файл. В конце регистратор выводит правильное сообщение об ошибке.

РЕДАКТИРОВАТЬ-2

<flow name="qbiif" doc:name="qbiif">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="9192" doc:name="HTTP" path="QBRest"/>
    <jersey:resources doc:name="REST">
        <component class="com.trinet.rest.RestIntegration"/>
    </jersey:resources>
</flow>

RestIntegration.java:

@Consumes(MediaType.APPLICATION_JSON)
@Produces("text/csv")
public Response postOperation(@PathParam("id1")String id, String cont) throws Exception{
        String res = appendData(cont); // become private method
        return Response.ok(res).header("Content-Disposition", "attachment;filename=QuickbooksAccountsJava.iif").header("mimeType", "text/csv").build();

Я использую клиент Chrome Rest в Windows. Я получаю ответ:

введите описание изображения здесь


person AKB    schedule 16.08.2014    source источник
comment
Я попытался воспроизвести ваш сценарий, и мне удалось создать и загрузить файл .. проблема может быть в ваших классах Java .. Не могли бы вы поделиться им, чтобы проблема могла быть обнаружена   -  person Anirban Sen Chowdhary    schedule 16.08.2014
comment
Создание правильного ответа должно быть задачей com.trinet.rest.RestIntegration. На самом деле не должно быть причин для добавления дополнительных компонентов или обработчиков сообщений после jersey:resources.   -  person David Dossot    schedule 16.08.2014
comment
Также есть опечатка: у вас </jersey:resource>, а должно быть </jersey:resources>.   -  person David Dossot    schedule 16.08.2014
comment
@DavidDossot обновил мой код   -  person AKB    schedule 18.08.2014


Ответы (1)


В вашем подходе есть недостаток дизайна.

com.trinet.rest.RestIntegration должно быть местом, где создается ожидаемый ответ:

  • Исправьте @Produces, чтобы он возвращал text/csv,
  • Переместите логику appendData в postOperation,
  • Установите заголовок Content-Disposition внутри postOperation.

Таким образом, вообще не должно быть необходимости в каком-либо дополнительном процессоре сообщений, кроме ресурсов Джерси, т.е. ваш поток должен быть таким:

<flow name="qbiif" doc:name="qbiif">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="9192" doc:name="HTTP" path="QBRest"/>
    <jersey:resources doc:name="REST">
        <component class="com.trinet.rest.RestIntegration"/>
    </jersey:resources>
</flow>
person David Dossot    schedule 18.08.2014
comment
Установите заголовок Content-Disposition внутри postOperation. Как мне установить в моем файле класса Rest? Могу ли я установить как mimetype, так и тип содержимого в Java лучше? - person AKB; 18.08.2014
comment
И нет: продолжайте использовать @Produces в качестве типа содержимого ответа. - person David Dossot; 18.08.2014
comment
Я добавил return Response.ok (res) .header (Content-Disposition, attachment; filename = QuickbooksAccountsJava.iif) .build (); сделал @Produces (text / csv) и оставил только rest call в mule. Но файл по-прежнему не загружается. - person AKB; 18.08.2014
comment
Не могли бы вы вставить curl -v взаимодействие, пожалуйста? Я хотел бы увидеть точный ответ, включая заголовки. - person David Dossot; 18.08.2014
comment
обновлено выше, я использую клиент для отдыха из Chrome и в windows env. - person AKB; 18.08.2014
comment
Файл не загружается в мою локальную систему. Как я уже сообщал ранее, если у меня нет компонента Java, файл с именем QuickbooksAccountsJava.i, если использовать загрузку локально в моей системе, мне нужен этот файл, чтобы продолжить работу. - person AKB; 18.08.2014
comment
Позвольте нам продолжить это обсуждение в чате. - person AKB; 18.08.2014
comment
проблема заключалась в том, что клиент Chrome Rest не показывает файл загрузки и его путь, нашел его в CURL - person AKB; 19.08.2014