我有:
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);
答案 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找到您的服务:
第二个是以编程方式添加帮助程序:
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包的根目录上。)