2014-09-29 2 views
4

у меня есть:Restlet Directory - по умолчанию index.html файла не служило

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, но безрезультатно, а также установить заголовок принять в запросе на текст/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); 
+0

Вы пытались использовать webdir.setIndexName ("index.html"); ? –

ответ

2

поведение вызвано тем, как ClapClientHelper класс определяет цель в виде файла или каталог. Обходным решением является замена класса ClapClientHelper другим почти идентичным, называемым say 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/услуги/org.restlet.engine.ClientHelper к вашему решению.
  2. этот файл должен иметь одну строку текста: полное имя (включая пакет) вашего вспомогательного класса

Второй является добавление помощника программным способом:

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

Попробуйте с помощью протокол WAR:

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

Обратите внимание на тройные косые черты, чтобы определить корень войны пакета, в противном случае вы получите NullPointerException.

(В моем случае у меня есть проект Maven, и мой индексный файл помещается в корень созданного военного пакета).

Смежные вопросы