Создание веб-сервиса REST на JBoss 7

Задание
Создать REST веб-сервис на примере сервера JBoss7

Решение
Для создания веб-сервисов в Java EE служит спецификация JAX-RS. С помощью данного API мы преобразуем бин EJB в веб-сервис REST

Предположим имеем некий класс сущность MyObj:
public class MyObj implements Serializable{

    private static final long serialVersionUID = -3393342801980571797L;

    private Long id;
    private String name;
    
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Так же имееем интерфейс сервиса для получения списка объектов.
@Local
public interface MyObjService {

    List<MyObj> getValues();
}

Для простоты данный интерфейс отмечен как локальный (Local).

Реализация сервиса представляет собой EJB компонент без сохранения состояния (Stateless):
@Stateless(name="MyObjServiceImpl")
public class MyObjServiceImpl implements MyObjService{
    
    private List<MyObj> values;
    
    @PostConstruct
    public void init(){       
        values = new ArrayList<MyObj>();
        MyObj obj = new MyObj();
        obj.setId(new Long(1));
        obj.setName("Test");
        values.add(obj);
        
        obj = new MyObj();
        obj.setId(new Long(2));
        obj.setName("Name");
        values.add(obj);        
    }
   
    @Override
    public List<MyObj> getValues() {
        return values;
    }
}

Необходимо преобразовать этот EJB компонент в REST веб-сервис. Для этого используются аннотации из пакета javax.ws.rs.*:
@Stateless(name="MyObjServiceImpl")
@Path("/demo")
@Produces({ "application/json" })
public class MyObjServiceImpl implements MyObjService{
    
    private List<MyObj> values;
    
    @PostConstruct
    public void init(){
        values = new ArrayList<MyObj>();
        MyObj obj = new MyObj();
        obj.setId(new Long(1));
        obj.setName("Test");
        values.add(obj);
        
        obj = new MyObj();
        obj.setId(new Long(2));
        obj.setName("Name");
        values.add(obj);        
    }
   
    @GET
    @Override
    public List<MyObj> getValues() {
        return values;
    }
}

Для  объявления компонента службой REST используется аннотация @Path, в качестве параметра у которой указывается относительный путь к сервису.

Аннотация @Produces({ "application/json" }) указывает MIME тип возвращаемых данных (MIME Type). В нашем примере будет возвращаться структура JSON. Другими возможными вариантами могли быть application/xml, text/plain и другие MIME типы.

Аннотация @GET у метода getValues, отмечает соответствующий HTTP метод при отправке которого серверу по указанному выше URI будет возвращаться результат. Для всех HTTP методов (GET, POST, DELETE и т.д.) имеются свои аннотации.

Важным моментом является подключение сервлета для обработки запросов. Для этого в дескрипторе развертывания (файл web.xml) указываем мэппинг сервлета javax.ws.rs.core.Application
     <servlet>
       <servlet-name>javax.ws.rs.core.Application</servlet-name>
       <load-on-startup>1</load-on-startup>
     </servlet>

    <servlet-mapping>        
        <servlet-name>javax.ws.rs.core.Application</servlet-name>        
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

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

Таким образом при обращении по адресу http://localhost:8080/test-web/rest/demo/ мы получим в результате следующую структуру JSON:
[{"id":1,"name":"Test"},{"id":2,"name":"Name"}]


Пример обработки отправки JSON объекта посредством POST запроса описан в статье Отправка Json объекта в REST сервис JAX-RS
comments powered by Disqus