【问题标题】:mule flow to create and download files用于创建和下载文件的 mule 流程
【发布时间】:2014-08-16 02:22:36
【问题描述】:

如果我在 mule 流中有一些 java 或 rest 组件,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 有效负载数据内容的文件。

我已经关注了这个link,但没有任何变化。

编辑

休息组件:

@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 组件,我可以下载文件。最后记录器打印正确的错误消息。

EDIT-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();

我在 Windows 中使用 Chrome Rest 客户端。我得到的回应是:

【问题讨论】:

  • 我已尝试复制您的场景,并成功创建和下载文件.. 问题可能出在您的 Java 类中.. 您能否分享它以便检测到问题
  • 产生正确的响应应该是com.trinet.rest.RestIntegration 的工作。真的没有理由在jersey:resources 之后添加额外的组件或消息处理器。
  • 还有一个错字:你有&lt;/jersey:resource&gt;,而它应该是&lt;/jersey:resources&gt;
  • @DavidDossot 更新了我的代码

标签: mule


【解决方案1】:

您的方法存在设计缺陷。

com.trinet.rest.RestIntegration 应该是创建预期响应的位置:

  • 修复@Produces,使其返回text/csv
  • appendData的逻辑移入postOperation
  • postOperation 内设置Content-Disposition 标头。

因此,除了 Jersey 资源之外,根本不需要任何额外的消息处理器,即您的流程应该是这样的:

<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>

【讨论】:

  • 在 postOperation 中设置 Content-Disposition 标头。如何在我的 Rest 类文件中设置?在 Java 中同时设置 mimetype 和 content type 更好吗?
  • 不:继续使用 @Produces 作为响应内容类型。
  • 我添加了 return Response.ok(res).header("Content-Disposition", "attachment;filename=QuickbooksAccountsJava.iif").build();制作了 @Produces("text/csv") 并且只有在骡子中休息。但是文件仍然没有下载。
  • 你能把curl -v的交互粘贴到bin中吗?我想查看确切的响应,包括标题。
  • 问题是 Chrome Rest 客户端不显示下载文件及其路径,在 CURL 中找到它
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多