如何访问App Engine应用程序存储的文件

时间:2016-02-19 11:40:59

标签: java maven google-app-engine

我在将countries.xml文件包含到我的GWT Web应用程序时遇到问题。

在应用服务器端,我使用JAXB从此文件中收集数据。在eclipse的本地构建中一切正常,但在部署到测试环境后,Unmarshaller无法找到提到的文件。

我不认为该文件包含在所有部署中。

问题是:我应该在哪里放置xml文件以成功包含在应用程序部署中?

如果缺少某些信息,请告诉我相关信息。

EDIT1:

enter image description here

加载文件:

    List<CountryDTO> list = new ArrayList<CountryDTO>();
    CountryXML countryXML;
    try {
        JAXBContext context = JAXBContext.newInstance(CountryXML.class);
        Unmarshaller un = context.createUnmarshaller();
        countryXML = (CountryXML) un.unmarshal(new File("target/classes/server/xml/countries.xml"));
        for (CountryXML country : countryXML.getCountries()) {
            list.add(convertToDTO(country)); //Simple converting from XmlRootObject to DTO
        }
    }
    catch (JAXBException e) {
        e.printStackTrace();
    }

JUnit测试:

public class XMLDataManagerTest {

    @Test
    public void getCountries() {
        XMLDataManager xmlDataManager = new XMLDataManager();
        List<CountryDTO> coutries = xmlDataManager.getCountries();
        System.out.println(coutries.toString());
    }

}

此测试的输出是我想要的。

2 个答案:

答案 0 :(得分:1)

首先,我相信该文件已成功上传。无论如何,您可以通过从App Engine下载应用程序来检查它。

./appcfg.sh -A <your_app_id> -V <your_app_version> download_app <output-dir>

您可以找到更多详情here

似乎应用程序布局在本地环境和云中是不同的。尝试通过ClassLoader加载您的文件。

getClass().getClassLoader().getResourceAsStream("/server/xml/countries.xml");

或通过ServletContext

getServletContext().getResourceAsStream("/server/xml/countries.xml");

您还可以查看我之前的questionanswer

似乎App Engine的首选解决方案是ServletContext

  

使用java.io.File或\ n阅读App Engine资源文件   javax.servlet.ServletContext.getResource/getResourceAsStream。他们是   无法通过Class.getResourceAsStream()访问。

答案 1 :(得分:0)

已解决,如下:

  • src/main/webapp/resources/countires.xml移至WEB模块,路径: URL countriesXMLURL = this.getServletContext().getResource("/resources/countries.xml")

代码示例:

    servlet中的
  •     JAXBContext context = JAXBContext.newInstance(CountryXML.class);
        Unmarshaller un = context.createUnmarshaller();
        countryXML = (CountryXML) un.unmarshal(countriesXMLURL);
    
  • 使用JAXB的XML管理器中的
  • import numpy as np
    import pandas as pd
    filename = 'file01'
    numbers = np.random.randn(5) # this data could be of any length, ~100
    tf = pd.DataFrame({'labels': filename , 'numbers': numbers})
    
    In [8]: tf
    Out[8]: 
       labels   numbers
    0  file01 -0.176737
    1  file01 -1.243871
    2  file01  0.154886
    3  file01  0.236653
    4  file01 -0.195053
    

现在一切正常。