在portlet中读取.json文件

时间:2014-06-10 18:48:05

标签: java portlet liferay-6

我想通过portlet读取静态json文件(用于测试)。

我把它放在/ json文件夹中。因此,在部署portlet时,该文件夹位于\ webapps文件夹中。 完整路径:webapps\myPortlet\json\op.json

在processAction方法中 -

@Override
public void processAction(ActionRequest request, ActionResponse response)
        throws PortletException, IOException {
    JSONParser parser = new JSONParser();
    try {
            JSONObject jsonObject = (JSONObject) parser.parse(new FileReader
            (request.getContextPath() + "/json/op.json"));

.
.
.
}

我收到了FileNotFoundException。

有人可以指出我访问此文件的正确方法。

3 个答案:

答案 0 :(得分:3)

首先,您可以使用一些不错的System.out来帮助自己(但请在之后删除它,因此它不会污染日志文件)。

如果您打印此信息

System.out.println( "request.getContextPath(): " + request.getContextPath() );
System.out.println( "new File(request.getContextPath()) : " + new File(request.getContextPath()).getAbsolutePath()  );
你会发现一点惊喜。您将从

获得更多信息
System.out.println( "new File() : " + new File().getAbsolutePath()  );

如果你真的需要加载一个静态文件,你应该问问自己为什么要这样做以及你将从中得到什么。不要编写一些你以后不需要的东西。也许您可以找到更好的解决方案 - 即使是更好(自动)可测试的解决方案。

如果你真的需要一个静态文件(如图像),你可以把它放在你班级附近的一个罐子里:

@see How to get a path to a resource in a Java JAR file

如果您需要将内容文件作为某种配置文件,则应重新考虑您的体系结构,并从一些可配置的参数(例如来自您的web.xml)中找到该文件的路径。

请记住:不要制作你不需要的东西。不要浪费你的时间来处理随后将在软件中集成的内容删除的内容。尝试摆脱依赖 - 即使是测试。

答案 1 :(得分:1)

您很可能以错误的方式使用分隔符,从而导致错误的路径。您可以通过调试甚至记录来检查。

尝试从计算机的资源管理器中获取实际文件的完整路径,并将其与您在运行时创建的路径进行比较

关于使用分隔符,您可以尝试这样的事情:

    String SEPARATOR = System.getProperty("file.separator");

    ServletContext ctxt = FacesService.getHttpServletRequest().getSession().getServletContext();
    String filepath = ctxt.getRealPath("json"+SEPARATOR+"op.json");
    System.out.println("File path = "+ filepath);

答案 2 :(得分:1)

首先,你应该尝试在src目录中包含文件或文件夹以及访问它的文件。

 URL url = getClass().getResource("op.json");

使用sops确保文件路径中没有特殊字符(文件夹名称中没有空格,替换特殊字符)。然后,您可以访问该文件。