Как представить EJB 3.1 в качестве веб-службы REST? - PullRequest
10 голосов
/ 27 марта 2012

Я обнаружил новую функцию в java restful при использовании EJB 3.1 при чтении статьи в блоге Адама Бина .

Дело в том, что bean-компоненты без состояний и Singleton могут быть представлены как корневые ресурсы.Но как?Я попытался сделать это следующим образом:

@Stateless
@LocalBean
@Path("Hybrid")
public class RESTEJBSample {

    @GET
    @Path("/demo")
    @Produces(MediaType.TEXT_PLAIN)
    public String something() {
        return "I am a Hybrid!!!";
    }

}

Когда я звоню по URL http://localhost:8080/HybridSample/resources/Hybrid/demo, я получаю сообщение об ошибке 404.

Appart этого и просто чтобы убедиться, что JAXRSЭто работает в моем проекте, я создал простой ресурс pojo, просто чтобы проверить, работает ли он нормально.

@Path("/genericresource")
public class GenericResource {
    @GET
    @Path("/samplemethod")
    @Produces(MediaType.TEXT_PLAIN)
    public String saySomething() {
        return "Something!";
    }
}

Здесь, когда я вызываю URL http://localhost:8080/HybridSample/resources/genericresource/samplemethod Он отлично работает!

Итак, мои вопросы:

  • что отсутствует в моем EJB, чтобы он мог работать как ресурс веб-службы, такой как класс GenericResource?

  • Требуется ли дополнительная настройка?

  • Каковы ограничения при использовании EJB в качестве веб-службы?

1 Ответ

11 голосов
/ 27 марта 2012

В соответствии с этим учебным курсом NetBeans о веб-службах RESTFul в Джерси вы можете решить, стоит ли

создать подкласс javax.ws.rs.core.Application, все остальные ресурсы будет зарегистрирован этим классом автоматически (Java EE 6)

или

создать адаптер сервлета REST Джерси по умолчанию в web.xml.

Я всегда использовал второй вариант, который заключается в добавлении этого к вашему web.xml:

<servlet>
    <servlet-name>ServletAdaptor</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>ServletAdaptor</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>

Использование вашего REST Web-сервиса в качестве EJB, по моему опыту, чрезвычайно полезно. Вы можете внедрить его в любое удобное для вас место, вы можете добавить в него свой EntityManager и даже использовать его в качестве DAO в некоторых простых ситуациях.

По поводу вашего вопроса / комментария о возможностях и ограничениях: корпоративные компоненты работают в контейнере EJB, независимо от того, развернуты они в файле war или нет. Вы можете внедрить в них JMS ConnectionFactory как ресурс, как описано в этом разделе Учебного руководства по Java EE 6. Благодаря внедрению ConnectionFactory, вы можете отправлять сообщения JMS. Если вы хотите получать сообщения JMS асинхронно, вам нужно определить компонент, управляемый сообщениями, как объяснено в этом разделе вышеупомянутого руководства. Я никогда не пытался расширить тот же EJB-компонент, который использовался для веб-службы Jersey, чтобы реализовать интерфейс MessageListener, но я думаю, что это также возможно (если нет, вы можете внедрить MDB в корневой компонент без сохранения состояния Jersey).

Наконец, вы можете использовать Управляемые контейнером транзакции, как объяснено здесь . Более того, с это руководство по NetBeans :

Чтобы вы могли видеть, что приложение будет использовать Java API транзакций (JTA) (транзакция-тип = "JTA"). Это указывает на то, что ответственность за управление жизненным циклом объектов в контекст постоянства назначен контейнеру.

<persistence-unit name="em" transaction-type="JTA">
...