2013-04-29 6 views
2

В настоящее время я разрабатываю веб-приложение, доступ к которому через HTTP можно получить через приложение Android или веб-браузер. Оба пользовательских агента в основном предоставляют одни и те же функции. Приложение Android вызывает веб-службы RESTful, созданные с помощью JAX-RS/Jersey, а веб-страницы - Facelets, поддерживаемые управляемыми фанами JSF. Таким образом, я считаю, что есть два типа возможных точек входа в веб-приложение. Веб-службы выполняют всю необходимую работу (доступ к ресурсам, выполнение операций с базами данных в DAO и т. Д.), И, самое главное, они должны действовать самостоятельно. Поэтому они представляют собой независимый слой.Вызов веб-службы JAX-RS из управляемого компонента JSF

Для того, чтобы повторно использовать код, полезно ли использовать веб-сервис из управляемого компонента? Совместимы ли их жизненный цикл?

Идея заключается в том, чтобы ввести объект Resource в управляемый компонент (с CDI, но не обязательно) и вызвать его методы программно. Веб-служба будет выступать в качестве бизнес-делегата (?) Для основных служб.

Я широко искал вопрос, но я не получил четкого ответа. Я видел некоторые фрагменты кода, в которых управляемый bean-компонент вызывает веб-службу с его URL-адресом, но поскольку все мои компоненты расположены в одном серверном приложении, я не вижу, что мешает мне связать их напрямую.

Вспомогательный вопрос об обработке ошибок: меня также раздражает идея перехвата WebApplicationExceptions из веб-службы в мой управляемый компонент для возврата сообщений об ошибках обратно в представление (с помощью FacesMessage). Мой отец всегда говорил мне, что я никогда не должен улавливать исключения во время выполнения ... Итак, есть ли хороший способ справиться с ними правильно?

ответ

1

В этом случае вам будет лучше отключить бизнес-логику от веб-службы в «некоторый центральный общий код». Затем веб-службы и управляемые компоненты будут вызывать общий код.

Я использовал термин «некоторый центральный общий код» в кавычках, так как то, что вы используете, зависит от среды выполнения. Если вы используете контейнер JavaEE, например Glassfish или JBoss, это звучит как идеальное использование EJB и сессионных компонентов без состояния (которые предназначены для обеспечения правильного управления ресурсами). Вы также можете использовать Spring Beans в качестве общего кода и централизовать логику таким образом.

Все зависит от того, что вы считаете более удобным из соображений развития и производства. Но обе поддерживают инъекцию, поэтому и веб-служба, и управляемые бобы JSF могут иметь услуги, вводимые как любой другой ресурс.

+0

Я согласен с ответом @EdH. Кроме того, для обработки ошибок, если вы отделяете свою бизнес-логику в EJB, вы можете управлять ошибками там и записывать в файл или что-то еще, а затем бросать только одно единственное ** UnexpectedException **, которое будет постоянно трансформироваться внутри вашего JSF к тому же ** FacesMessage ** с дружественным текстом (вы можете сделать это даже с фильтром для упрощения). –

+0

На самом деле, мое веб-приложение развернуто в контейнере сервлетов Tomcat, и я не хочу (хочу) иметь весь полный стек JEE, включая CDI. –

+0

Ваш ответ, очевидно, правильный, и я проверяю его, но я чувствовал, что он вводит новый слой _heavy_, а уровень веб-службы отлично справился бы с этим, если бы не была проблема с обработкой ошибок. Итак, спасибо, я собираюсь представить «общий код», который вы упомянули ... –