当我尝试在弹簧控制器中读取属性文件时,我得到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>
答案 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):
src/main/webapp/WEB-INF/props/configFile.properties
或ClassLoader.getResource
ClassLoader.getResourceAsStream
或ServletContext.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