我在运行战争时遇到了FileNotFoundException

时间:2018-03-23 08:11:40

标签: java spring

这是一个代码行,我用它来访问xml文件。

Contacts contactsEntity = (Contacts) um.unmarshal(new FileReader(new File(classLoader.getResource("Contacts.xml").getFile())));

这是我在战争中得到的:

java.io.FileNotFoundException: file:\D:\apache-tomcat-8.0.50\webapps\pb\WEB-INF\lib\phonebook-server-0.0.1-SNAPSHOT.jar!\Contacts.xml (The filename, directory name, or volume label syntax is incorrect)

P.S。这100%不是文件访问的问题,因为我创建了一个生成JAXB类的简单项目,从资源文件夹解组相同的xml,一切正常。

这是一个项目结构:

enter image description here

1 个答案:

答案 0 :(得分:3)

您已标记,因此我假设您可以使用它。

部署后你的战争是否解压缩(例如Tomcat)?

如果是,

使用ClassPathResource#getFile()

您的问题是getFile()返回的字符串。它包含感叹号(!)和file:协议。你可以自己处理所有这些并为此实现自己的解决方案,但这将重新发明轮子。

幸运的是,Spring有一个org.springframework.core.io.ClassPathResource。要获取文件,只需编写new ClassPathResource("filename").getFile();在您的情况下,您需要替换

Contacts contactsEntity = (Contacts) um.unmarshal(new FileReader(new File(classLoader.getResource("Contacts.xml").getFile())));

Contacts contactsEntity = (Contacts) um.unmarshal(new FileReader(new ClassPathResource("Contacts.xml").getFile()));

现在,您的程序在部署和解压缩时也应该正常工作。

如果不是(推荐,如果您不确定则使用此项),

您必须使用InputStream,因为资源不作为文件系统上的文件存在,而是存放在存档中。

这应该有效:

Contacts contactsEntity = (Contacts) um.unmarshal(new InputStreamReader(new ClassPathResource("Contacts.xml").getInputStream()));

(没有春天):

Contacts contactsEntity = (Contacts) um.unmarshal(new InputStreamReader(classLoader.getResourceAsStream("Contacts.xml")));