Tapestry如何提供动态生成的XML文件?

时间:2013-06-10 18:20:44

标签: file dynamic download tapestry generated

我在最后一年的项目(Maven + Hibernate + Spring + Tapestry)上遇到了与Tapestry相关的问题。我希望有人可以提供帮助。 我在我的服务层上生成了一个XML文件(其内容是我创建的自定义格式的MySql DB数据)(我尝试了它并且它是正确生成的:它是工作)。我从Junit测试中测试了它。问题是我无法使用Tapestry 从视图层开始工作。

I tried this but unsuccessfully 我认为这是因为文件已经不存在了:当用户点击“下载XML ”链接时,会动态生成。

此处您是我的源代码(用户点击指向此页面的链接)。 页面的POJO( xmlService.exportXml 是我的服务层创建XML文件的方法):

public class DownloadAll {
    @Component
    private Form xmlDownloadForm;

    @Property
    private File xmlFile;

    @Property
    @SessionState(create=false)
    private UserSession userSession;

    @Inject
    private XmlService xmlService;

    public StreamResponse onSubmit() {
      xmlFile = xmlService.exportXml(userSession.getUserProfileId());
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
      InputStream input = DownloadAll.class.getResourceAsStream("exportedData-"
          + userSession.getLoginName() + timeStamp + ".xml");
      return new XMLAttachment(input);
    }
}

这是页面模板:

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
    t:type="Layout" t:pageTitle="title"
    xmlns:p="tapestry:parameter"
    t:menuExplanation="menuExplanation">
      <form t:type="Form" t:id="xmlDownloadForm">
    <input type="submit" value="${message:download}"/>
  </form>
</html>

有人知道如何让它发挥作用吗?谢谢和问候。

编辑:当我提交表单但未提供文件时,会生成文件(我可以在文件夹中看到它)。我得到了这个错误:

  

org.apache.tapestry5.runtime.ComponentEventException类   es.udc.decompras.web.pages.xml.util.XMLAttachment已被转换   并且可能无法直接实例化。

XMLAttachment与JPEGAttachment.java from this link相同。这里是源代码:

public class XMLAttachment extends AttachmentStreamResponse {

    public XMLAttachment(InputStream is, String args) {
      super(is, args);
      this.contentType = "application/xml";
      this.extension = "xml";
    }

    public XMLAttachment(InputStream is) {
      super(is);
      this.contentType = "application/xml";
      this.extension = "xml";
    }
}

1 个答案:

答案 0 :(得分:1)

只有页面可以在您的“页面”包中。将XMLAttachment类移动到不受tapestry管理的任何包(例如NOT base,components或pages)。

Tapestry在托管包上执行字节代码魔术,并使用特殊的类加载器加载它们,这与实用程序类不兼容等。