Servlets 未从Servlet读取CSV文件

Servlets 未从Servlet读取CSV文件,servlets,jakarta-ee,war,Servlets,Jakarta Ee,War,正如标题所说,我有一个CSV文件,它不会从我的web应用程序中加载。我正在使用Netbeans构建项目 每当我从Netbeans启动项目时,它都会像它应该的那样工作。然而,当我从Glassfish接口中获取war文件并尝试部署它时,它会显示未定义的变量,这告诉我它没有读取该文件。下面的屏幕截图显示了正在发生的事情和我的文件夹结构 我在这里读了很多帖子,@BalusC提供了一些很好的信息,但它对我不起作用,我相信这是我的错,但我需要一些更具体的帮助,而不仅仅是阅读另一篇帖子 正如BalusC所指出

正如标题所说,我有一个CSV文件,它不会从我的web应用程序中加载。我正在使用Netbeans构建项目

每当我从Netbeans启动项目时,它都会像它应该的那样工作。然而,当我从Glassfish接口中获取war文件并尝试部署它时,它会显示未定义的变量,这告诉我它没有读取该文件。下面的屏幕截图显示了正在发生的事情和我的文件夹结构

我在这里读了很多帖子,@BalusC提供了一些很好的信息,但它对我不起作用,我相信这是我的错,但我需要一些更具体的帮助,而不仅仅是阅读另一篇帖子

正如BalusC所指出的,我已经将要加载的CSV文件放入/src/main/resources文件夹中。我用来加载文件的代码如下

作为补充说明,我有一个JSP,用于检查文件的位置和访问权限。当手动部署应用程序时,JSP可以访问和显示文件而不会出现任何问题

编辑:我运行了一个调试,没有发现任何错误,所以我在详细模式下运行了glassfish并加载了页面,页面启动后,它开始从文件中读取并发送数据,但仍然在所有字段中显示“未定义”

下面是在详细模式下运行glassfish的输出数据

[#|2017-05-05T16:34:37.609+0900|INFO|glassfish 4.1|DukeETFServlet|_ThreadID=33;_ThreadName=http-listener-1(3);_TimeMillis=1493969677609;_LevelValue=800;|
  Connection open.|#]

[#|2017-05-05T16:34:38.014+0900|INFO|glassfish 4.1|DukeETFServlet|_ThreadID=109;_ThreadName=__ejb-thread-pool3;_TimeMillis=1493969678014;_LevelValue=800;|
  Sent: ABRN / Arbor Realty Trust 7.375% Senior / 25.32 / 25.11 / 25.24 / 12000 / 24.27 / 26.15 / Fri May 05 16:34:38 JST 2017|#]

[#|2017-05-05T16:34:38.016+0900|INFO|glassfish 4.1|DukeETFServlet|_ThreadID=109;_ThreadName=__ejb-thread-pool3;_TimeMillis=1493969678016;_LevelValue=800;|
  Connection closed.|#]

[#|2017-05-05T16:34:38.024+0900|INFO|glassfish 4.1|DukeETFServlet|_ThreadID=34;_ThreadName=http-listener-1(4);_TimeMillis=1493969678024;_LevelValue=800;|
  Connection open.|#]

[#|2017-05-05T16:34:38.029+0900|INFO|glassfish 4.1|DukeETFServlet|_ThreadID=119;_ThreadName=__ejb-thread-pool4;_TimeMillis=1493969678029;_LevelValue=800;|
  Sent: ABT / Abbott Laboratories / 44.01 / 43.60 / 43.65 / 7487400 / 36.76 / 45.84 / Fri May 05 16:34:38 JST 2017|#]
下面是加载文件的数据

Servlet

@WebServlet(urlPatterns={"/dukeetf"}, asyncSupported=true)
public class DukeETFServlet extends HttpServlet {
private static final Logger logger = Logger.getLogger("DukeETFServlet");
private static final long serialVersionUID = 2114153638027156979L;
private Queue<AsyncContext> requestQueue;
@EJB private PriceVolumeBean pvbean; 

@Override
public void init(ServletConfig config) {
    /* Queue for requests */
    requestQueue = new ConcurrentLinkedQueue<>();
    /* Register with the bean that provides price/volume updates */
    pvbean.registerServlet(this);
}

/* PriceVolumeBean calls this method every second to send updates */
public void send(String ticker, String name, float highPrice, float lowPrice,
float closingPrice, int volume, float fiftyTwoWeekHigh, float fiftyTwoWeekLow,
String currentTime) {
    /* Send update to all connected clients */
    for (AsyncContext acontext : requestQueue) {
        try {
            String msg = String.format("%s / %s / %.2f / %.2f / %.2f / %d /"
                    + " %.2f / %.2f / %s",
                    ticker, name, highPrice, lowPrice, closingPrice, volume, 
                    fiftyTwoWeekHigh, fiftyTwoWeekLow, currentTime);
            PrintWriter writer = acontext.getResponse().getWriter();
            writer.write(msg);
            logger.log(Level.INFO, "Sent: {0}", msg);
            /* Close the connection
             * The client (JavaScript) makes a new one instantly */
            acontext.complete();
        } catch (IOException ex) {
            logger.log(Level.INFO, ex.toString());
        }
    }
}

/* Service method */
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

    response.setContentType("text/html");

    /* Put request in async mode. */
    final AsyncContext acontext = request.startAsync();
    /* Remove from the queue when done */
    acontext.addListener(new AsyncListener() {
        @Override
        public void onComplete(AsyncEvent ae) throws IOException {
            requestQueue.remove(acontext);
            logger.log(Level.INFO, "Connection Being Closed.");
        }
        @Override
        public void onTimeout(AsyncEvent ae) throws IOException {
            requestQueue.remove(acontext);
            logger.log(Level.INFO, "Connection Has Timed Out.");
        }
        @Override
        public void onError(AsyncEvent ae) throws IOException {
            requestQueue.remove(acontext);
            logger.log(Level.INFO, "Connection error.");
        }
        @Override
        public void onStartAsync(AsyncEvent ae) throws IOException { }
    });
    /* Add to the queue */
    requestQueue.add(acontext);
    logger.log(Level.INFO, "Connection Being Opened.");
}

}

您是如何构建WAR文件的?每当我编译程序时,Netbeans都会构建它。我已经检查了war中我试图加载的文件,并且正在使用它进行编译。您如何知道您的
timeout
方法正在被调用?(我刚刚意识到,如果你的
getListOfStocks
方法无法读取
stockdata.csv
文件,那么它将NPE)我将在这里冒险说,当我通过Netbeans运行它时,它工作正常,并在ArrayList中的每个对象上打勾,这意味着我的超时方法工作正常。这就是上面显示数据的截图所暗示的。但是,我知道如果它不能读取stockdata.csv文件,它将停止运行timeout方法。为了补充这一点并为您提供一些额外信息,我在应用程序中还有一个JSP(出于测试原因),它可以很好地读取文件,无论是由Netbeans部署还是手动执行。
//Get Stock Data From CSV File
public static ArrayList<Stock> getListOfStocks() throws IOException {


    ArrayList<Stock> stocks = new ArrayList();
    ClassLoader classLoader = 
    Thread.currentThread().getContextClassLoader();
    InputStream is = 
    StockService.class.getResourceAsStream("/stockdata.csv");

    // create an instance of BufferedReader
    // using try with resource, Java 7 feature to close resources
    try (CSVReader reader = new CSVReader(new InputStreamReader(is))) {

        // read the first line from the text file
        String[] nextLine;
        reader.readNext();

        // loop until all lines are read
        while ((nextLine = reader.readNext()) != null) {

            Stock newStock = new Stock(nextLine[0], nextLine[1], 
                Float.valueOf(nextLine[2]), Float.valueOf(nextLine[3]),
                Float.valueOf(nextLine[4]), Integer.valueOf(nextLine[5]),
                Float.valueOf(nextLine[6]), Float.valueOf(nextLine[7]));

            stocks.add(newStock);
        }

    }

  return stocks;

}
/* Updates price and volume information every second */
@Startup
@Singleton
public class PriceVolumeBean {
/* Use the container's timer service */
@Resource TimerService tservice;
private DukeETFServlet servlet;
//Set Variable for Counter
private int i = 0;
//Set date time variable

String currentTime;
//Set Variables for Stock Data
private String ticker;
private String name;
private float highPrice;
private float lowPrice;
private float closingPrice;
private int volume;
private float fiftyTwoWeekHigh;
private float fiftyTwoWeekLow;
private static final Logger logger = Logger.getLogger("PriceVolumeBean");

@PostConstruct
public void init() {
    /* Intialize the EJB and create a timer */
    logger.log(Level.INFO, "Initializing EJB.");
    servlet = null;
    tservice.createIntervalTimer(2000, 2000, new TimerConfig());
}

public void registerServlet(DukeETFServlet servlet) {
    /* Associate a servlet to send updates to */
    this.servlet = servlet;
}

@Timeout
public void timeout() throws IOException {

    // Update Date
    Date date = new Date();        

    // Set stock variables //
    ticker = StockService.getListOfStocks().get(i).getTicker();
    name = StockService.getListOfStocks().get(i).getName();
    highPrice = StockService.getListOfStocks().get(i).getHighPrice();
    lowPrice = StockService.getListOfStocks().get(i).getLowPrice();
    closingPrice = StockService.getListOfStocks().get(i).getClosingPrice();
    volume = StockService.getListOfStocks().get(i).getVolume();
    fiftyTwoWeekHigh = StockService.getListOfStocks().get(i).getFiftyTwoWeekHigh();
    fiftyTwoWeekLow = StockService.getListOfStocks().get(i).getFiftyTwoWeekLow();
    currentTime = date.toString();

    // Send updated information
    if (servlet != null)
        servlet.send(ticker, name, highPrice, lowPrice, closingPrice,
                volume, fiftyTwoWeekHigh, fiftyTwoWeekLow, currentTime);

    // Counter that keeps from going beyond size of arraylist
    i++;        
    if (i == 100) {
        i = 0;
    }

}
}