2015-03-12 4 views
0

В существующем проекте Java SE мои коллеги реализовали множество веб-сервисов в Restlet, опираясь на реализацию внутреннего сервера. В конечном итоге это оказалось неадекватным, поэтому мы перешли на серверный движок, основанный на причале 9, с большим недостатком, который Restlet did not support it back then. Это не остановило команду, и теперь с нашей бизнес-логикой было реализовано немало «сырых» HTTP-сервлетов.Работает ли Restlet вместе с HTTP-сервлетами

Поскольку это оказалось разочаровывающим способом внедрения веб-сервисов, мы теперь хотим вернуть Restlet для будущих услуг и заставить их работать вместе с этими сервлетами. В моих исследованиях не было никаких оснований полагаться на такую ​​интеграцию, за исключением того, что Request and Response wrapper to the HTTP counterparts все еще продолжается и отмечен как незапланированный. Кроме того, значительная часть существующей работы над этими сервлетами значительна, поэтому я помещаю преобразование в ресурсы Restlet в качестве последнего средства.

Чтобы суммировать вопрос, как я могу заставить приложение Restlet работать вместе с HTTP-сервлетами на одном сервере? Есть ли способ в Java SE подключить приложение Rest к контейнеру сервлета? Или, думая наоборот, есть ли способ подключить сырые сервлеты к Приложению с каким-то дополнительным сервисом, например оболочкой Servlet-to-Resource, которая может быть применена к любому сервлету HTTP? Любое возможное, неинвазивное решение может быть принято.

ответ

1

Похоже, что org.restlet.ext.servlet пакет совместим с Java SE издания Restlet, даже если она указана в группе Java EE. Ниже приведены шаги, которые следует выполнить:

Создайте ServletAdapter, который преобразует запросы сервлетов HTTP и ответы на высокоуровневые реквизиты. Сама документация предполагает инкапсулировать ее.

public class RestletHttpServlet extends HttpServlet { 

    private ServletAdapter adapter; 
    private final Restlet restlet; 

    public RestletHttpServlet(Restlet restlet) { 
     this.restlet = restlet; 
    } 

    @Override 
    public void init() throws ServletException { 
     super.init(); 
     this.adapter = new ServletAdapter(getServletContext()); 
     this.restlet.setContext(this.adapter.getContext()); 
     this.adapter.setNext(this.restlet); 
    } 

    @Override 
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     this.adapter.service(req, resp); 
    } 
} 

С помощью этого вспомогательного класса, просто создавать новые restlets и прикрепите их с помощью сервлета API (используя контекстные обработчики здесь):

Restlet myRestlet = ... 
ServletContextHandler cHandler = new ServletContextHandler(); 
cHandler.addServlet(new ServletHolder(new RestletHttpServlet(myRestlet)), "/myRestlet/*"); 
ContextHandlerCollection contextHandlers = new ContextHandlerCollection(); 
contextHandlers.setHandlers(new Handler[]{cHandler}); 
server.setHandler(contextHandlers); 

Маршрутизаторы, ресурсы и пути шаблон, кажется, работают хорошо. Создание первого рестарта Application также возможно и часто полезно для полной инициализации контекста.

2

Если я правильно понимаю ваш вопрос, вы хотите встроить приложение Restlet в контейнер сервлетов. В этом случае вы должны использовать расширение org.restlet.ext.servlet. Последний предоставляет сервлет ввода, который отправляет запросы на серверные ресурсы приложения Restlet

См. Эту ссылку для получения более подробной информации о том, как настроить эту функцию: https://github.com/restlet/restlet-tutorial/blob/master/modules/org.restlet.tutorial.markdown/02_Server_Side/04_Server_Deployment/02_Servlet_Deployment.md.

Надежда это помогает, Тьерри

+0

У нас есть автономное приложение сервера Java SE, а 'org.restlet.ext.servlet' - для версии EE Restlete. Если нет работы, связанной с этой работой над версией SE, я боюсь, что это не поможет. –

+0

Я снова прочитал ваш вопрос, и теперь это яснее. Не могли бы вы дать мне, что ваши сервлеты точно используют от запроса и ответа (особенно заголовки)? Тогда я мог бы предоставить вам реализацию для этого ... Мы могли бы работать постепенно и вносить свой вклад в расширение Restlete 'ext.servlet'. Этот подход подходит вам? –

+0

Ну, они только, кажется, извлекают произвольные параметры строки запроса и отправляют объекты ответа, печатая строку и устанавливая соответствующий тип контента. Для меня это больше не является приоритетом, но вы можете сообщить мне, если вы проявите инициативу. –

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