【发布时间】: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之后添加额外的组件或消息处理器。 -
还有一个错字:你有
</jersey:resource>,而它应该是</jersey:resources>。 -
@DavidDossot 更新了我的代码
标签: mule