将sitemap.xml写入java webapp根目录权限被拒绝

时间:2015-01-19 21:17:48

标签: java tapestry

我尝试使用sitemapgen4j库来构建我的站点地图。我在尝试写入根目录时面临权限问题

https://code.google.com/p/sitemapgen4j/

根上下文文件夹(/ src / main / webapp)

异常

Problem writing sitemap file /sitemap.xml 
java.io.FileNotFoundException
/sitemap.xml (Permission denied)

代码

File directory = new File("/");
WebSitemapGenerator wsg = new WebSitemapGenerator("http://localhost:8080/app", directory);

有人知道怎么做吗?

1 个答案:

答案 0 :(得分:1)

我创建了一个临时目录来存储站点地图文件,然后在第一次请求时生成它,并为所有后续请求提供相同的版本,因为我的应用程序中的数据一旦发生就不会改变#39 ; s开始了。

使用临时目录的好处是你绝对能够写入它(至少我是这么认为的。)

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.charset.Charset;
import java.io.BufferedReader;

private Path sitemapDirectory;

@RequestMapping("/sitemap.xml")
public void sitemap(HttpServletResponse response) throws IOException {
    PrintWriter w = response.getWriter();
    boolean isSitemapAlreadyCreated = sitemapDirectory != null;
    if (isSitemapAlreadyCreated) {
        pipeSitemapToResponse(w);
        return;
    }
    sitemapDirectory = Files.createTempDirectory("mySitemap");
    WebSitemapGenerator wsg = new WebSitemapGenerator("http://localhost:8080/app", sitemapDirectory.toFile());
    wsg.addUrl("http://localhost:8080/app/home");
    wsg.write();
    pipeSitemapToResponse(w);
}

private void pipeSitemapToResponse(PrintWriter w) {
    Path sitemap = Paths.get(sitemapDir.toString(), "sitemap.xml");
    Charset charset = Charset.forName("UTF-8");
    try (BufferedReader reader = Files.newBufferedReader(sitemap, charset)) {
        String line = null;
        while ((line = reader.readLine()) != null) {
            w.write(line);
        }
    } catch (IOException e) {
        logger.error("Failed to read the sitemap file.", e);
    }
}

此解决方案使用Spring请求映射。它还希望将站点地图文件写为sitemap.xml,除非您有> 50k条目,否则您需要阅读有关处理索引文件的sitemapgen4j doco并调整此示例。< / p>