La comunidad Java ha estandarizado los servicios web RESTful bajo las especificacions JSR 311 y JSR 339. El nombre coloquial para este estándar es JAX-RS. Y la implementación de referencia es Jersey.

Hace poco tenía que comunicar dos aplicaciones y decidí hacerlo mediante RESTful. Tras investigar un poco llegué a Jersey. Un par de semanas después estoy, a partes iguales, asombrado, satisfecho y emocionado.

Jersey es una librería espectacular. Es la mejor libreria que he utilizado nunca bajo Java (y llevo una temporada por aquí). Con diferencia.

Es…

  • completa (cubre todos los casos, al menos todos los que yo me he encontrado o he podido pensar)
  • fácil de usar e intuitiva (configuración muy moderna con anotaciones, excelente arquitectura)
  • muy bien documentada
  • integrada (con servidores y, sobre todo, otros estándares Java)
  • extensible (y además muy facilmente)

Si tenéis que usar RESTful en un proyecto Java (tanto servidor como cliente) no lo dudéis ni un instante. Un 10.Un ejemplo real, copiar y pegar tal cual, del recurso que permite consultar y modificar artículos.

@Path("articles")
@RolesAllowed("api")
public class Articles {
    private static final Logger log = LoggerFactory.getLogger(Articles.class);

    @GET
    @Path("{idArticle: [0-9]+}")
    @Produces("application/json")
    public Article getArticle(@PathParam("idArticle") int id) throws SQLException {
        return DB.getArticlesDB().get(id);
    }

    @PUT
    @Consumes("application/json")
    public void setAll(List<Article> articles) throws SQLException {
        log.debug("setAll() amb {} registres", articles.size());
        DB.getArticlesDB().setAll(articles);
    }

    @PUT
    @Path("set")
    @Consumes("application/json")
    public void set(Article article) throws SQLException {
        log.debug("set({})", article);
        DB.getArticlesDB().set(article);
    }
}

Sin conocer la librería os podéis hacer una idea bastante real de lo que hace. Lo bueno es que no hay ni una línea de configuración, todo se autoconfigura buscando anotaciones.También he implementado un mecanismo de validación personalizado basado en una cabecera propia. La idea la he extraido de estos artículos:Securing, Versioning and Auditing REST (JAX-RS, Jersey) APIsHow to secure REST services exposed with Jersey (JAX-RS) using Spring SecurityLos artículos basan sus ejemplos en Jersey 1 pero no son difíciles de adaptar. De hecho con Jersey 2 es aún más sencillo.</article>