Spring MVC中属性文件的FileNotFoundError

时间:2016-08-05 11:04:11

标签: java spring spring-mvc

当我尝试在弹簧控制器中读取属性文件时,我得到FileNotFoundException

以下是显示其发生的时间和地点的日志:

java.io.FileNotFoundException: src\main\webapp\WEB-INF\props\configFile.properties (The system cannot find the file specified)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at com.webclaims.translator.Translator.readPropertiesFile(Translator.java:65)
at com.webclaims.translator.Translator.createEditablePage(Translator.java:45)
at com.webclaims.translator.controllers.TestController.editableWebpage(TestController.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

我的属性文件的位置是src/main/webapp/WEB-INF/props/configFile.properties

以下是日志中显示editableWebpage()的控制器:

@RequestMapping(value = "/edit")
public ModelAndView editableWebpage() throws IOException {
    final String source = "http://localhost:8080/translator/test";
    final String target = "src/main/webapp/WEB-INF/jsp/editable_webpage.jsp";
    final String config = "src/main/webapp/WEB-INF/props/configFile.properties";

    Translator t = new Translator();
    t.createEditablePage(source, target, config);

    return new ModelAndView("editable_webpage");
}

然后我们转到我的Java类,它具有上面日志中显示的createEditablePage()

@PropertySource(value = "configFile.properties")
public class Translator {

@Autowired
private Properties properties;

private static final Logger LOGGER = Logger.getLogger(Translator.class.getName());

public Translator() {
    this.properties = new Properties();
}

public Properties getProperties() {
    return properties;
}

public void setProperties(Properties properties) {
    this.properties = properties;
}

public void createEditablePage(String source, String target, String config) {
    File file = new File(target);
    try {
        Document doc = Jsoup.connect(source).get();
        Elements elements = doc.select("*");
        readPropertiesFile(config);
        for(Element element : elements) {
            if(!element.ownText().equals("")) {

                String key = getKeyFromPropertiesFile(element.text().toString());
                if(!key.equals("")) {
                    element.addClass(key);
                    element.attr("contentEditable", "true");
                }
            }
        }
        FileUtils.writeStringToFile(file, doc.outerHtml(), "UTF-8");
    } catch (IOException e) {
        LOGGER.log(Level.SEVERE, "IOException has occured", e);
    }
}

private void readPropertiesFile(String config) {
    try {
        File propsFile = new File(config);
        FileInputStream inputStream = new FileInputStream(propsFile);
        properties.load(inputStream);
        inputStream.close();
    } catch(FileNotFoundException e) {
        LOGGER.log(Level.SEVERE, "FileNotFoundException has occured", e);
    } catch(IOException e) {
        LOGGER.log(Level.SEVERE, "IOException has occured", e);     
    }
}   

以下是我在web.xml中的内容:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
    <display-name>translator</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name> 
        <param-value>/WEB-INF/spring-servlet.xml</param-value> 
    </context-param> 
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

我的spring-servlet.xml包含两个bean,其中一个bean告诉spring有关属性文件的信息。

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"    
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
xmlns:p="http://www.springframework.org/schema/p"    
xmlns:mvc="http://www.springframework.org/schema/mvc"   
xmlns:context="http://www.springframework.org/schema/context"    
xsi:schemaLocation="http://www.springframework.org/schema/beans    
                    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
                    http://www.springframework.org/schema/mvc   
                    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                    http://www.springframework.org/schema/context    
                    http://www.springframework.org/schema/context/spring-context-4.3.xsd">

<mvc:annotation-driven/> 
<context:component-scan base-package="com.webclaims.*" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

<bean id="propertiesFile" class="com.webclaims.translator.Translator">
    <property name="properties" value="/WEB-INF/props/configFile.properties"></property>
</bean>

3 个答案:

答案 0 :(得分:0)

您的位置不匹配!

在value属性中指定了value =“/ WEB-INF / props / configFile.properties”

但您提到您的文件位于“/WEB-INF/config/configFile.properties”

如果您仍面临问题,请尝试将属性文件放在src文件夹中

答案 1 :(得分:0)

试试这个..

值= “SRC /主/ web应用/ WEB-INF /道具/ configFile.properties”

答案 2 :(得分:0)

Oups,这里对关键概念存在一些误解......

我的属性文件的位置是this 。不。这是您的属性文件来源的位置。你有一个构建传递,它将构建一个.war文件,该war文件将由一个servlet容器运行。在那一刻(运行时),所有对源文件的引用都已丢失。

构建过程将(广义上讲并假设构建maven):

  • 将所有java文件编译为类文件并将它们放在/ WEB-INF / classes
  • 从/ WEB-INF / classes下的src / main / resources中复制所有文件,这些文件在运行时可以作为src/main/webapp/WEB-INF/props/configFile.propertiesClassLoader.getResource
  • 的资源访问
  • 直接从/下复制src / main / webapp中的所有文件,并且可以在运行时作为ClassLoader.getResourceAsStreamServletContext.getResource的资源进行访问。

将资源用于只读数据更好,因为您可以透明地使用位于应用程序内部署的jar的ServletContext.getResourceAsStream文件夹中的资源。

无论如何,如果您确实需要打开Web应用程序的文件,唯一正确的方法是使用方法META-INF/resources将相对于应用程序根目录的路径转换为绝对路径在服务器上(并且不再在开发者的来源中)

因此,要阅读属性文件,您应该从ServletContex获取它作为一个资源:

    控制器中的
  • 使用 relative 路径并获取ServletContext.getRealPath

    InputStream
  • @RequestMapping(value = "/edit") public ModelAndView editableWebpage(ServletRequest request) throws IOException { final String source = "http://localhost:8080/translator/test"; final String config = "/WEB-INF/props/configFile.properties"; ... InputStream inputStreamConfig = request.getServletContext() .getResourceAsStream(config); t.createEditablePage(source, target, inputStreamConfig); return new ModelAndView("editable_webpage"); } 方法中,只需加载属性:

    readPropertiesFile

但是你的代码还有其他问题:

  • properties.load(inputStreamConfig); 课程中你有两个:

    Translator

    意味着应该注入属性,

    @Autowired
    private Properties properties;
    

    在构造函数中初始化它。 一个是没用的

  • public Translator() { this.properties = new Properties(); } 类使用Translator注释,因此它应该是一个Spring bean,但是您使用Autowired创建它。不要这样做,而是将其注入控制器

  • 在web.xml中,您为DispatcherServlet context =&gt;的根上下文声明了相同的文件。每个bean将被创建两次,每次上下文一次。但是你没有声明任何ContextLoaderListener来引导Spring。通常会发现这一点:

    new