如何从服务层访问webapp / resources文件夹的内容?我需要访问一个用于Elasticsearch映射的JSON文件......
这是我的项目结构的样子: https://www.dropbox.com/s/crdzae1ko0x9p89/Screenshot%202015-05-25%2010.24.12.png?dl=0
我试过这个: http://www.mkyong.com/java/java-read-a-file-from-resources-folder/
String mapping = String.format("es_mappings/%s.json", type);
ClassLoader classLoader = getClass().getClassLoader();
String result = IOUtils.toString(classLoader.getResourceAsStream(mapping));
但是我在上面的代码片段中的第三行有一个空指针异常。
还试过这个:
File file = ResourceUtils.getFile("classpath:es_mappings/bom_exports.json")
String txt= FileUtils.readFileToString(file);
但是我收到了这个错误:java.io.FileNotFoundException:类路径资源[es_mappings / bom_exports.json]无法解析为绝对文件路径,因为它不驻留在文件系统中。
我在我的-servlet.xml文件中有这个:
<mvc:resources location="/resources/" mapping="/resources/**"/>
感谢。
答案 0 :(得分:1)
使用相对路径取决于类加载器,因此您需要找出类加载器所在的位置,否则只需使用绝对路径 -
使用getResourceAsStream
时,您需要从前导/
开始,请尝试以下操作:
String mapping = String.format("/es_mappings/%s.json", type);
ClassLoader classLoader = getClass().getClassLoader();
String result = IOUtils.toString(classLoader.getResourceAsStream(mapping));
此外,我不确定默认情况下,webapp/resources
文件夹会在maven中添加到类路径中。通常,您需要在运行时访问的文件等资源位于src/main/resources
目录中。 (但我可能错了,简单的方法是检查打包的war文件,如果文件在/WEB-INF/classes
,那么它们在类路径上)
答案 1 :(得分:1)
我使用此代码。它很简单而且有效。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
// ...
@Value("/resources/json/your_file.json")
private Resource jsonResource;
// ...
InputStream jsonStream = jsonResource.getInputStream();
现在您可以使用流来读取json。
答案 2 :(得分:0)
ResourceUtils.getFile("classpath:es_mappings/bom_exports.json")
当您传递classpath时,此方法从webapp / WEB-INF / classes获取资源文件:*。 如果要从webapp / resources / es_mappings / your_file.json获取json文件,服务类可以实现ServletContextAware接口并获取servletContext。由于webapp目录由Web容器(如tomcat或jetty)确定,因此它只从servletContext.getResource()获取相对路径。该方法可以在webapp下获取资源。 代码示例可能是:
class your_service implements ServletContextAware {
private ServletContext servletContext;
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
public void getJsonResource() {
...//other code
String josnFilepath = servletContext.getResource(
"/resources/es_mappings/your_file.json");
}
}
此外,您可以通过查找&#34; WEB-INF / classes&#34;来获取webapp目录。类路径中的子串。
String path = this.getClass().getResource("").getPath();
String fullPath = URLDecoder.decode(path, "utf-8");
String pathArr[] = fullPath.split("/WEB-INF/classes/");
if (2 == pathArr.length) { //pathArr[0] is webapp directory path
String jsonFilepath = pathArr[0] + "/resources/es_mappings/your_file.json";
}