File Tapestry如何为动态生成的XML文件提供服务?

File Tapestry如何为动态生成的XML文件提供服务?,file,dynamic,download,tapestry,generated,File,Dynamic,Download,Tapestry,Generated,我在最后一年的项目(Maven+Hibernate+Spring+Tapestry)中遇到了与Tapestry相关的问题。我希望有人能帮忙。 我在我的服务层上生成了一个XML文件(它的内容是我创建的自定义格式的MySql DB数据)(我尝试了它,并且正确地生成了它:它正在工作。我从Junit测试中测试了它。问题是我无法使用Tapestry从视图层使其工作 我认为这是因为文件还不存在:当用户单击“下载XML”链接时,它是以友好方式生成的 这是我的源代码(用户单击指向此页面的链接)。 页面的POJ

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

我认为这是因为文件还不存在:当用户单击“下载XML”链接时,它是以友好方式生成的

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

这是页面模板:

<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>
“页面”包中只能有页面。将XMLAttachment类移动到任何不由tapestry管理的包中(例如不包括base、components或pages)

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

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


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

感谢repply@uklance。我在util子包(es.udc.decras.web.pages.xml.util)上有XMLAttachment。子包也有效吗?不,所有子包也都被管理。对于页面,子包将是URL的一部分。非常感谢@uklance!它真的解决了我的问题:)。我从谷歌搜索中读到了这一点,但我明白这个Java类不应该出现在pages包中:我不明白这个Java类不应该出现在pages子包中。我现在唯一的问题是,我无法使用InputStream input=DownloadAll.class.getResourceAsStream(“exportedData——”+userSession.getLoginName()+timeStamp+“.xml”)但如果我使用InputStream input=new FileInputStream(xmlFile),则效果会非常好:/请尝试使用SomeNonComponentClass.class.getClassLoader().getResourceAsStream(…)作为类。getResourceAsStream(…)要求资源与类位于同一个包文件夹中。这与tapestry无关。谢谢您的repply@uklance。我在util子包(es.udc.decras.web.pages.xml.util)上有XMLAttachment。子包也有效吗?不,所有子包也都被管理。对于页面,子包将是URL的一部分。非常感谢@uklance!它真的解决了我的问题:)。我从谷歌搜索中读到了这一点,但我明白这个Java类不应该出现在pages包中:我不明白这个Java类不应该出现在pages子包中。我现在唯一的问题是,我无法使用InputStream input=DownloadAll.class.getResourceAsStream(“exportedData——”+userSession.getLoginName()+timeStamp+“.xml”)但如果我使用InputStream input=new FileInputStream(xmlFile),则效果会非常好:/请尝试使用SomeNonComponentClass.class.getClassLoader().getResourceAsStream(…)作为类。getResourceAsStream(…)要求资源与类位于同一个包文件夹中。这与tapestry无关。
<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>
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";
    }
}