Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Интеграция RWT/RAP Jetty JAX-WS

Anna | 3.06.2014 | нет комментариев
При разработке RAP/RCP приложения у меня появилась задача: как сделать кастомные error-pages и интегрировать их в embedded jetty. В интернете есть уйма обучалок тому, как это сделать, если вы встраиваете Jetty в свое приложение. Но с RWT все труднее. RWT сам занимается запуском Jetty и стартует его как managed service. При этом сам интерфейс Jetty спрятан от других бандлов и трудиться с ним напрямую не получится.
Я пошел немножко дальше и решил расширить фнкциональность до исполнения всяких сервлетов тем самым Jetty, тот, что встроен в RWT приложение. И, самое основное интегрировать JAX-WS веб-сервисы туда же. Сочувствующим, благо пожаловать под кат.

Подраземевается, что приложение запускается из OSGi платфопмы, у меня это Equinox.

Для начала, из документации вестимо, что дозволено сделать определенный Jetty customizer и, передав системным свойством его наименование, получить некоторую кастомизацию. Так и сделаем: при запуске каждого приложения передадим

-Dorg.eclipse.equinox.http.jetty.customizer.class=ru.futurelink.jetty.customizer.MyJettyCustomizer

Код кастомайзера:

public class MyJettyCustomizer extends JettyCustomizer {
	@Override
	public Object customizeContext(Object context,
			Dictionary<String, ?> settings) {

		ServletContextHandler c = (ServletContextHandler) context;

		// Сервлет, раздающий файлы
		c.getServletHandler().addServletWithMapping(
			MyFileServlet.class, "/files/*");

		// Сервлет, обслуживающий веб-сервисы JAX-WS
		// import com.sun.xml.ws.transport.http.servlet.WSServlet;
		c.getServletHandler().addServletWithMapping(
			WSServlet.class, "/service/mobile");

		// Сервлет-обработчик страниц ошибок
		ErrorHandler errorHandler = new MyJettyErrorHandler();
		errorHandler.setShowStacks(true);		
		c.setErrorHandler(errorHandler);

		// Добавляем веб-сервисы JAX-WS (самое увлекательное внизу)
		c.getServletContext().getContextHandler().
			addEventListener(new MyServletContextListener());

		return c;	
	}
}

Здесь мы делаем следующее:
1) Мапим какие-то сервлеты, по определенным урлам, сейчас они там будут доступны, здесь все легко.
2) Устанавливаем кастомный обработчиик для ложных страниц.
3) Добавляем обслуживание веб-сервисов JAX-WS — об этом подробнее в конце, это увлекательно ;)

Если с первым пунктом все ясно и легко — пишем сервлет, мапим его на URL и вуаля, он доступен, то 2-й требует примера кода обработчика, вот он:

public class MyJettyErrorHandler extends ErrorHandler {
	@Override
	protected void handleErrorPage(HttpServletRequest request,
			Writer writer, int code, String message) throws IOException {
		if (code == 404) {
			writer.write("No,no,no!!! This page does not exist!");
			return;
		}

		super.handleErrorPage(request, writer, code, message);
	}
}

Сейчас дозволено обработать всякий HTTP response code необходимым нам методом.

Сейчас самое увлекательное, интергируем JAX-WS в наше RWT прлиожение. Трудность здесь появляется при реализации самого веб-обслуживания. Нам нужно сделать XML изложение, которое поместить в WEB-INF/sun-jaxws.xml.

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
	<endpoint name="ClientService" 
		implementation="ru.futurelink.mo.mobile.server.ClientService" 
		url-pattern="/service/mobile"/>
</endpoints>

Но наше приложение никак не хочет видеть данный файл изложение и создавать эти самые финальные точки. А стандартное решение, которое предлагается для JAX-WS для создания финальных точек в рантайме не подходит, т. к. порождает еще один веб-сервер com.sun.net.httpserver. Нужно вешать его на обособленный порт, да и вообще, как-то коряво это. Нужно другое решение, которое будет применять теснее присутствующий Jetty для обработки запросов к веб-сервисам.

Мы теснее добавили сам сервлет, тот, что будет обрабатывать запросы к веб-сервису, сейчас нужно Дабы заработали финальные точки (endpoints). Впрочем, так, как наш план работает в OSGi фреймворке, то файл изложение, тот, что мы только что сотворили JAX-WS не видит. Все дело в том, что JAX-WS не является совместимым OSGi бандлом, правда мы его перепаковали (верю это так?) в бандл из простого JAR и добавили ему манифест. Нужно принудить его скушать данный файл, при этом сделать все верно в жанре OSGi.

Каждый наш кастомайзер мы упаковываем во фрагмент к хосту org.eclipse.equinox.http.jetty. Это непременно, как вестимо фрагмент расширяет classpath.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB