About

13 нояб. 2013 г.

REST with Jersey 2.x : start (part 1)


Jersey один из популярных фреймворкок для создание RESTFull веб сервисов. Реализуюет спецификацию JAX-RS(JSR311 & JSP 339).
На данный момент последняя версия 2.4.
Чем он хорош - простой, понятный, ничего лишнего.
Запущу небольшой пример на Glassfish.

Краткий план действий.
1. Создание простого веб сервиса.
2. Конфигурация и деплой.
3. Работа с json.



1. Создание простого веб сервиса.

В документации сказано, что при использовании Glassfish, достаточно объявить зависимость:

<dependency>
    <groupid>javax.ws.rs</groupid>
    <artifactid>javax.ws.rs-api</artifactid>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>

Репозиторий центральный мавеновский. Все подгружается без дополнительных указаний.

И создам простейший сервис возвращающий строку.

package com.str.jersey.service;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path(value = "/rest")
public class JerseyService {

   @GET
   @Path("/say")
   @Produces(MediaType.TEXT_PLAIN)
   public String say(){
       return "Wonderful!";
  }
}

@Produces(MediaType.TEXT_PLAIN) говорит о возвращаемом типе - строка. Этот сервис должен возвращать строку по относительному урлу rest/say.

Но пока еще запускать рано. Нетбинс выдает такое предупреждение:

В проекте нет конфигурации. 

 2. Конфигурация и деплой.

При использовании контейнера сервлетов, поддерживающего servlet 3.0, можно  сконфигурировать добавив подобный класс:
package com.str.jersey.application;

import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath(value = "/")
public class MyApplication extends ResourceConfig {

   public MyApplication () {
      packages("com.str.jersey.service");
   }
}

Для ResourceConfig нужно добавить зависимость:
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.4</version>
    <type>jar</type>
</dependency>

Это только один из способов конфигурации. В данном случае не нужен web.xml. Для Jersey версий 1.x он понадобится.

Итого, что получается:
Проект готов к запуску.
И запустив :


3. Работа с json

JSON - формат передачи данных.
Существуие несколько json провайдеров для работы с json объектами и конвертации в java объекты. Jackson, MOXy,  Jettisson и др.
Остановлюсь на Jackson.
Пусть веб сервис будет возвращать некий класс:
@GET
   @Path("/mycat")
   @Produces(MediaType.APPLICATION_JSON)
   public CrazyCat getMyCat(){
     CrazyCat cat = new CrazyCat();
     cat.setEyes("green");
     return cat;
   }

Теперь ожидается что по урл rest/mycat будет возвращен json объект.
Чтобы все заработало, в pom.xml необходимо добавить зависимость jackson библ:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.4</version>
</dependency>

Т.к никаких дополнительных фич не использую, достаточно добавить в конфигурацию одну строку:
@ApplicationPath(value = "/")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        packages("com.str.jersey.service");
        register(JacksonFeature.class);
    }
}

И, внимание, запуск... Возникает досадный эксепшн:

SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.str.jersey.model.CrazyCat, and Java type class com.str.jersey.model.CrazyCat, and MIME media type application/json was not found

   
Казалось бы все на месте согласно документации. Решение было найдено на stackoverflow
Добавить еще одну зависимость:
 <dependency>
    <groupId>com.owlike</groupId>
    <artifactId>genson</artifactId>
    <version>0.98</version>
 </dependency>

Итого:
Проект с сервисом возвращим json объект.

На этот раз запуск успешен:
Ура, готово.

Netbeans 7.4
Glassfish 3.1.2
Maven наше всё :)
Бессменная документация Jersey.
SVN с исходниками получившегося.
Stackoverflow о спобобах деплоя JAX-RS.


0 comments:

Отправить комментарий