Статьи

Как объединить REST-сервисы с EJB 3.1

Технология служб REST ( JAX-RS ) стала частью платформы Java EE 6 , что является отличной новостью для разработчиков REST.

В очень простом веб-приложении я продемонстрирую, как сервисы REST можно комбинировать с другими технологиями Java EE, в частности EJB 3.1 .

  1. Прежде всего, нам нужно указать путь к ресурсам REST. Ранее в Java EE 5 единственным способом сделать это было зарегистрировать определенный адаптер сервлета в 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>

    API JAX-RS (начиная с версии 1.1.4) представил специальную аннотацию ( @ javax.ws.rs.ApplicationPath ), которая предоставляет альтернативу конфигурации web.xml:

     package org.netbeans.rest.application.config;/** * This class is generated by the Netbeans IDE, * and registers all REST root resources created in the project. * Please, DO NOT EDIT this class ! */@javax.ws.rs.ApplicationPath("resources")public class ApplicationConfig extends javax.ws.rs.core.Application {}

    Примечание . Класс ApplicationConfig расширяет javax.ws.rs.core.Application . Есть два метода, которые могут быть реализованы из суперкласса:

         public Set<Class<?>> getClasses();     public Set<Object> getSingletons();

    Эти методы определяют набор корневых ресурсов и поставщиков, доступных из этого пути приложения. Таким образом, пользователи могут указать несколько групп ресурсов REST (не обязательно дизъюнктивных) в одном веб-приложении. Среда IDE NetBeans 6.8 обеспечивает реализацию по умолчанию javax.ws.rs.core.Application, содержащую все корневые ресурсы REST и провайдеров, указанных в веб-приложении. Пользователи могут указать строку URL (например, «ресурсы» ), которая будет использоваться для доступа к этим ресурсам. Пользователи также могут реализовать пользовательский подкласс (ы) javax.ws.rs.core.Application .

  2. Во-вторых, мы создаем класс Singleton EJB, который будет использоваться для сохранения состояния ресурса REST (созданного в следующем стебле). Это класс:
    package name;import javax.annotation.PostConstruct;import javax.ejb.Singleton;@Singletonpublic class NameBean {       private String name;|       @PostConstruct    private void init() {        name="Robin Hood";    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

    Примечание . Singleton EJB — это новая функция в Java EE 6. Контейнер гарантированно поддерживает один общий экземпляр EJB 3.1 Singleton. Это означает, что Singletons может кэшировать состояние на уровне приложения. @PostContruct аннотации используются для аннотирования способа выполнения какой — либо инициализация вещи, и это называется контейнером только после того, как один экземпляра создаются.

  3. Последний шаг — создание простого корневого ресурса REST с использованием одноэлементного NameBean для сохранения его состояния:
    package name;import javax.ejb.*;import javax.ws.rs.*;@Path("name")@Statelesspublic class NameService {    @EJB    private NameBean nameBean;    @GET    @Produces("text/html")    public String getHtml() {        return "<h2>Hello "+nameBean.getName()+"</h2>";    }    @PUT    @Consumes("text/plain")    public void put(String content) {        nameBean.setName(content);    }}

    Примечание. Внедрение зависимостей используется для внедрения NameBean в ресурс. Аннотация EJB 3.0 @Stateless — это удобный способ включения внедрения зависимостей. Если эта аннотация отсутствует, поле nameBean не будет инициализировано контейнером. Другие аннотации взяты из спецификации JAX-RS (JSR311).

IDE NetBeans предоставляет возможность тестирования на основе RESTful на основе JavaScript, которую можно использовать для тестирования методов HTTP GET, POST, PUT или DELETE. Это пример вызова HTTP PUT для ресурса REST, расположенного по адресу « http: // localhost: 8080 / RestApplication / resources / name »:

Наконец, метод HTTP GET также можно легко протестировать, введя URI ресурса в браузере: