1

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

我试过这个但不成功 我认为这是因为文件不存在:当用户点击“下载 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相同这是源代码:

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";
    }
}
4

1 回答 1

1

只有页面可以在您的“页面”包中。将 XMLAttachment 类移动到任何不由 Tapestry 管理的包(例如,不是基础、组件或页面)。

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

于 2013-06-10T19:35:39.543 回答