Как я могу обслуживать определенный ресурс пути к определенному адресу с помощью встроенного причала?

Я ищу, чтобы выставить файл clientacesspolicy.xml с встроенного сервера причала.

Моя текущая попытка выглядит следующим образом:

ContextHandler capHandler = new ContextHandler();
capHandler.setContextPath("/clientaccesspolicy.xml");
capHandler.setBaseResource(Resource.newClassPathResource("clientaccesspolicy.xml"));
HandlerList handlers = new HandlerList();
handlers.addHandler(capHandler);
...
httpServer.setHandler(handlers);

Но я получаю 404 доступ к http://localhost:9000/clientaccesspolicy.xml

Как я могу подвергнуть ресурс classpath заданному URL-адресу программно в Jetty?

Спасибо, Andy

Ответ 1

Ваш код не работает, потому что ContextHandler фактически не загружает содержимое. Небольшая настройка сделает его видом работы, но для того, чтобы сделать то, что вы действительно хотите, вам нужно будет написать собственный обработчик.

Версия типа "вид работ":

ContextHandler capHandler = new ContextHandler();
capHandler.setContextPath("/clientaccesspolicy.xml");
ResourceHandler resHandler = new ResourceHandler();
resHandler.setBaseResource(Resource.newClassPathResource("clientaccesspolicy.xml"));
capHandler.setHandler(resHandler);

Но, эта версия рассматривает /clientaccesspolicy.xml как каталог, поэтому перенаправляет на /clientaccesspolicy.xml/, а затем отображает содержимое XML файла.

Похоже, что вам нужна версия ResourceHandler, которая имеет поиск url ​​= > ресурса. Jetty не отправляет с обработчиком, который делает это, но вы должны иметь возможность создать подкласс ResourceHandler, а затем переопределить getResource. В этом случае вам не нужно [или хотите] ContextHandler, просто проверьте на вызовы "/clientaccesspolicy.xml" и сопоставьте его с правильным ресурсом ClassPath.

Ответ 2

На самом деле вы можете просто зарегистрировать путь класса как ресурс пути класса (удивительно).

ResourceHandler resHandler = new ResourceHandler();
resHandler.setBaseResource(Resource.newClassPathResource("/"));
server.setHandler(resHandler);

Затем вы можете получить доступ к тем файлам, которые находятся в вашем пути к классу. Поэтому, если у вас есть файл .xml, он будет отправлен с localhost: 9000/file.xml.