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

我有:

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

这在按名称提供目录中的所有文件时有效.

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

当您访问“/”时,您将获得200响应和应用程序/八位字节流内容类型.否则响应是空的.目录上的getIndexName确保它是索引

我也试过getMetadataService().addExtension(“html”,MediaType.TEXT_HTML,true);帮助它获取index.html文件,但无济于事,并在请求中设置接受标头为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);

最佳答案 该行为是由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找到你的服务:

>将一个名为META-INF / services / org.restlet.engine.ClientHelper的文件添加到您的解决方案中.
>此文件应该有一行文本:助手类的全名(包括包)

第二个是以编程方式添加帮助程序:

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