Restlet Directory - 未提供默认的index.html文件

时间:2014-09-29 13:31:01

标签: java restlet

我有:

Directory webdir = new Directory(getContext(), "clap://class/webapp");
webdir.setDeeplyAccessible(true);
router.attach("",webdir);

当按名称提供目录中的所有文件时,这是有效的。

但是,当您访问“/”时它应该提供index.html而它不会。我已经尝试过路径,额外路由器等的所有组合,但它仍然无法正常工作。

当您访问“/”时,您会收到200响应和应用程序/八位字节流内容类型。否则响应是空的。目录上的getIndexName向我保证index

我还尝试getMetadataService().addExtension("html", MediaType.TEXT_HTML, true);来帮助它获取index.html文件,但无效,并在请求中将accept头设置为text / html。

ETA:这是与此处描述的相同(未解决)问题:http://restlet-discuss.1400322.n2.nabble.com/Serving-static-files-using-Directory-and-CLAP-from-a-jar-td7578543.html

任何人都可以帮忙吗?这让我疯了。

经过一番摆弄后,我现在已经有了这个解决方法,但如果可能的话我宁愿不重定向:

        Redirector redirector = new Redirector(getContext(), "/index.html", Redirector.MODE_CLIENT_PERMANENT);
        TemplateRoute route = router.attach("/",redirector);
        route.setMatchingMode(Template.MODE_EQUALS);

2 个答案:

答案 0 :(得分:2)

行为是由ClapClientHelper类将目标标识为文件或目录的方式引起的。解决方法是将ClapClientHelper类替换为另一个名为JarClapClientHelper的几乎相同的类。复制ClapClientHelper的源代码,并使用handleClassLoader方法更改以下代码段。

  // The ClassLoader returns a directory listing in some cases.
  // As this listing is partial, it is of little value in the context
  // of the CLAP client, so we have to ignore them.
  if (url != null) {
    if (url.getProtocol().equals("file")) {
      File file = new File(url.getFile());
      modificationDate = new Date(file.lastModified());

      if (file.isDirectory()) {
        url = null;
      }
    //NEW CODE HERE
    } else if (url.getProtocol().equals("jar")) {
      try {
        JarURLConnection conn = (JarURLConnection) url.openConnection();
        modificationDate = new Date(conn.getJarEntry().getLastModifiedTime().toMillis());
        if (conn.getJarEntry().isDirectory()) {
          url = null;
        }

      } catch (IOException ioe) {
        getLogger().log(Level.WARNING,
                "Unable to open the representation's input stream",
                ioe);
        response.setStatus(Status.SERVER_ERROR_INTERNAL);
      }
    }
  }

现在您需要加载此助手而不是默认助手。 (感谢@Thierry Boileau。)

有两种方法,一种不需要任何代码,另一种是程序化的。 第一个是让ServiceLoader找到您的服务:

  1. 将一个名为META-INF / services / org.restlet.engine.ClientHelper的文件添加到您的解决方案中。
  2. 此文件应该有一行文本:助手类的全名(包括包)
  3. 第二个是以编程方式添加帮助程序:

    Engine.getInstance().getRegisteredClients().add(0, new JarClapClientHelper(null));
    

答案 1 :(得分:0)

尝试使用WAR协议:

Directory directory = new Directory(getContext(), "war:///");
directory.setIndexName("index.html");
router.attach("/", directory);

注意三重斜杠以识别war包根,否则你将获得NullPointerException

(在我的情况下,我有一个Maven项目,我的索引文件放在生成的war包的根目录上。)