2012-03-06 2 views
0

Я пытаюсь добавить службы отдыха в приложение для расположений, используя трикотаж. Для этого мне нужно разделить код Java таким образом, чтобы к нему можно было обычно обращаться как с распорками, так и с остальными api. Это делается для того, чтобы код был разделен между остальными и стойками, и любые изменения отражались бы в обеих службах. Мне хотелось бы знать, насколько эта идея возможна и погодя, как обычно люди проектируют службы отдыха ,Добавление службы отдыха в приложение для расположений

ответ

2

Хотя наш уровень представления не основан на Struts (обычно это Spring Web MVC или JSF), мы используем Spring 3.0 + Java EE 6, в частности, EJB 3.0 и JPA 2.0 для таких ситуаций.

EJB 3.0 факсимильные сессионные компоненты EJB 3.0 отлично работают - они могут иметь декларативную (на основе аннотации) инъекцию зависимостей и демаркацию транзакций или сами управлять своими транзакциями, зависимостями и ресурсами, используя любой традиционный механизм. Они бесшовно интегрируются с JPA 2.0 и достаточно легки для модульного тестирования. Основное преимущество перед чистыми фасолью Spring заключается в том, что они могут быть развернуты независимо от веб-приложения (как JJB EJB).

На лицевой стороне веб-сервисов мы также используем Jersey/JAX-RS. Поскольку инъекция зависимостей Джерси/JAX-RS нарушена (она не использует Weld/CDI, как и остальная часть Java EE), нам пришлось прибегать к Spring DI, чтобы «подключить» к классам ресурсов REST на передней панели с помощью «back-end» EJB. Хорошо, что это работает достаточно хорошо, чтобы вводить EJB в наши MVC-контроллеры и также можно использовать с управляемыми фазами JSF. В качестве альтернативы вы можете написать свои ресурсы REST-ful только с помощью Spring (любой из них имеет свои плюсы и минусы, но в целом оба хорошо выполняют эту работу).

Я знаю, что я прояснил все это, но я был бы рад поделиться более подробной информацией по запросу.


EDIT: Некоторые подробности, как на запрос.

Вы сначала остановитесь для обучения Джерси/JAX-RS, это должно быть Jersey User Guide. Есть также несколько руководств/примеров, которые вы можете легко найти в «Сети».

Хотя вы должны быть в состоянии разместить ресурсы Джерси/JAX-RS в той же WAR, что и ваши страницы Struts, мы пошли с более простой альтернативой их развертывания отдельно.

Теперь, при развертывании в Glassfish 3.1, мы удалили ошибку this, также задокументировали here. Суть в том, что инъекция @EJB не работает для нас, как и ожидалось.

Итак, вместо этого мы вернулись к весне, используя модуль ввода jersey-spring, следуя этому example.

В любом случае, остальная часть этого стандарта является стандартом Java EE 6/EJB 3.0. Мы идентифицируем и помещаем все общие функциональные возможности в «сервисный» уровень, который в значительной степени реализован как E12B.

Стойкость обрабатывается через JPA @Entity s доступ через инъекцию JPA EntityManager. Сделки декларативно демаркируются с использованием @TransactionAttribute.

Вот быстрый иллюстрация типичного EJB + службы JPA боба:

@Stateless 
public class WidgetServiceBean implements WidgetService { 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    public List<Widget> findWidgetByName(String name) { 
     return em.createNamedQuery("Widget.findByName", Widget.class) 
      .setParam("name", name).getResultList(); 
    } 

    @Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void removeWidgetById(int id) { 
     em.find(Widget.class, id).remove(); 
    } 
} 

(Очевидно, не качество продукции, а просто показывает, как «худой», они могут быть.)

Сервисный уровень и сущности упакованы в виде EJB JAR, которые могут быть развернуты отдельно и доступны для всех других модулей с помощью глобального поиска JNDI. Или они могут быть развернуты в Struts или JAX-RS WAR, а с Java EE 6 (Glassfish 3.x) они будут найдены, развернуты как часть модуля и предоставлены другим компонентам в пределах одной WAR.

Некоторые могут утверждать, что проще использовать весенние бобы, если вы используете контейнер Spring в любом случае. Я бы сказал, вероятно, но тогда вам также придется использовать Spring Persistence framework и платформу транзакций Spring. (Spring также предоставляет декларативные транзакции и настойчивость.) Если вы уже сильно инвестировали в Spring, это может быть более простым путем.

Ото, EJB 3.0, JPA 2.0 и JTA также значительно упрощены от своих предшественников и являются частью стандарта Java EE, так что это архитектурное решение с большим количеством измерений.

+0

Tnx, мне бы хотелось узнать больше о том, как вы это сделали. – Emil

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