【问题标题】:java.io.EOFException: No content to map to Object due to end of inputjava.io.EOFException:由于输入结束,没有要映射到 Object 的内容
【发布时间】:2017-08-04 13:03:45
【问题描述】:

我正在尝试在服务器(tomcat)部署时加载文件。如果我从 Eclipse 运行 webapp,它会很好用。 但是如果我发动战争并部署它,我会得到这个异常

java.io.EOFException: No content to map to Object due to end of input
at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2173)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2125)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1395)
at com.vems.util.JSONUtil.jsonToObject(JSONUtil.java:76)
at com.vems.util.DataUtil.loadData(DataUtil.java:54)
at com.vems.security.VEMSApplicationObject.loadApplicationSetups(VEMSApplicationObject.java:65)
at com.vems.security.VEMSApplicationObject.startApplication(VEMSApplicationObject.java:53)
at com.vems.security.VEMSContextListener.contextInitialized(VEMSContextListener.java:16)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5099)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5615)

我试过ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

`<build>
<resources>
    <resource>
        <filtering>true</filtering>
        <directory>src/main/resources</directory>
    </resource>
</resources>

`

`InputStream in=ClassLoader.getSystemResourceAsStream("data/budgetSetup.json");
BufferedReader br = new BufferedReader(new InputStreamReader(in));`

但我仍然遇到同样的错误。请帮我。 这是我的 VEMSApplicationObject.java 代码,其中 fileName = "data/budgetSetup.json";

`public String readFile(String fileName, boolean resourceFile) {
        try {
            File file;
            if (resourceFile) {
                ClassLoader classLoader = this.getClass().getClassLoader();
                file = new File(classLoader.getResource(fileName).getFile());
            } else {
                file = new File(fileName);
            }
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);
            try {
                StringBuilder sb = new StringBuilder();
                String line = br.readLine();

                while (line != null) {
                    sb.append(line);
                    line = br.readLine();
                }
                return sb.toString();
            } finally {
                fr.close();
                br.close();
            }
        } catch (Exception e) {
           System.out.println("Here is The Exception " + e);
        }
        return "";
    }`

这里是异常 java.io.FileNotFoundException: C:\Program%20Files\Apache%20Software%20Foundation\Tomcat%207.0\webapps\VEMS\WEB-INF\classes\data\budgetSetup.json(系统找不到指定的路径)

【问题讨论】:

    标签: java json tomcat7 classloader filereader


    【解决方案1】:

    如果想在tomcat启动时加载一些资源可以使用如下方法:

    1 - 在您的 web.xml 文件中添加:

    <listener>
        <listener-class>com.mycompany.mywebapp.ContextListener</listener-class>
    </listener>
    

    2 - 在您的项目中创建包com.mycompany.mywebapp 和一个类ContextListener

        package com.mycompany.mywebapp;
    
        import java.io.File;
    
        import javax.servlet.ServletContextEvent;
        import javax.servlet.ServletContextListener;
    
        public class ContextListener implements ServletContextListener {
    
            @Override
            public void contextDestroyed(ServletContextEvent event) {
    
            }
    
            @Override
            public void contextInitialized(ServletContextEvent event) {
                try {
                    String webroot =    event.getServletContext().getRealPath("/");
                    File myFile = new File(webroot + "/WEB-INF/data/budgetSetup.json");
    
                    /***
                     * do your work with file etc...
                     */
                } catch (Exception ignored) {
                    ignored.printStackTrace();
                }
            }
        }
    

    3 - 将你的 json 文件放在 /WEB-INF/data/ 下

    现在 tomcat 应该在启动时加载您的文件。

    【讨论】:

    • 感谢您提供的解决方案。它工作得很好。请告诉我为什么ClassLoader classLoader = this.getClass().getClassLoader(); file = new File(classLoader.getResource(fileName).getFile()); 不起作用。自从过去几个月以来一直有效,现在突然停止工作。
    【解决方案2】:

    解决了这个问题。 tomcat 安装路径是问题(C:\Program Files\Apache Software Foundation\Tomcat 7.0)。因为它包含空格,即程序和文件之间的空间以及 Apache、软件和基金会之间的空间。因此,在上传战争时,此路径将转换为 C:\Program%20Files\Apache%20Software%20Foundation\Tomcat%207.0 并导致 java.io.FileNotFoundException:

    所以在c:\tomcat安装tomcat

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 2018-09-23
      • 2019-04-13
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多