Spring:如何访问服务层中webapp / resources的内容

时间:2015-05-25 04:01:42

标签: java spring

如何从服务层访问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/**"/>

感谢。

3 个答案:

答案 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";
}