Suporte de Jersey MVC

Suporte de Jersey MVC

1. Visão geral

Jersey is an open-source framework for developing RESTFul Web Services.

Além de servir como implementação de referência JAX-RS, também inclui várias extensões para simplificar ainda mais o desenvolvimento de aplicativos da web.

Neste tutorial,we’ll create a small example application that uses the Model-View-Controller (MVC) extension offered by Jersey.

Para saber como criar uma API com Jersey, verifique estewrite-up here.

2. MVC em Jersey

Jersey contains an extension to support the Model-View-Controller (MVC) design pattern.

Antes de tudo, no contexto dos componentes de Jersey, o Controller do padrão MVC corresponde a uma classe ou método de recurso.

Da mesma forma, o modo de exibição corresponde a um modelo vinculado a uma classe ou método de recurso. Finalmente, o modelo representa um objeto Java retornado de um método de recurso (Controller).

To use the capabilities of Jersey MVC in our application, we first need to register the MVC module extension that we wish to use.

Em nosso exemplo, usaremos o popular mecanismo de modelo JavaFreemarker. Este é um dos mecanismos de renderização suportados pelo Jersey fora da caixa, juntamente comMustachee Java Server Pages (JSP) padrão.

Para obter mais informações sobre como o MVC funciona, consulte estetutorial.

3. Configuração do aplicativo

Nesta seção, começaremos configurando as dependências Maven necessárias em nossopom.xml.

Em seguida, veremos como configurar e executar nosso servidor usando um servidorGrizzly incorporado simples.

3.1. Dependências do Maven

Vamos começar adicionando a extensão Jersey MVC Freemarker.

Podemos obter a versão mais recente deMaven Central:


    org.glassfish.jersey.ext
    jersey-mvc-freemarker
    2.27

Também vamos precisar do contêiner de servlet Grizzly.

Novamente, podemos encontrar a versão mais recente emMaven Central:


    org.glassfish.jersey.containers
    jersey-container-grizzly2-servlet
    2.27

3.2. Configurando o servidor

Para fazer uso do suporte a templates Jersey MVC em nosso aplicativowe need to register the specific JAX-RS features provided by the MVC modules.

Com isso em mente, definimos uma configuração de recurso personalizada:

public class ViewApplicationConfig extends ResourceConfig {
    public ViewApplicationConfig() {
        packages("com.example.jersey.server");
        property(FreemarkerMvcFeature.TEMPLATE_BASE_PATH, "templates/freemarker");
        register(FreemarkerMvcFeature.class);;
    }
}

No exemplo acima, configuramos três itens:

  • Primeiro, usamos o métodopackages para dizer a Jersey para escanear o pacotecom.example.jersey.server para classes anotadas com@Path. . Isso registrará nossoFruitResource

  • Em seguida, configuramos o caminho base para resolver nossos modelos. Isso diz a Jersey para procurar em/src/main/resources/templates/freemarker  os modelos do Freemarker

  • Finalmente, registramos o recurso que lida com a renderização do Freemarker por meio do sclassFreemarkerMvcFeature 

3.3. Executando o aplicativo

Agora vamos ver como executar nosso aplicativo Web. Usaremosexec-maven-plugin para configurar nossopom.xml para executar nosso servidor da web incorporado:


    org.codehaus.mojo
    exec-maven-plugin
    
        com.example.jersey.server.http.EmbeddedHttpServer
    

Vamos agora compilar e executar nosso aplicativo usando Maven:

mvn clean compile exec:java
...
Jul 28, 2018 6:21:08 PM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
Application started.
Try out http://localhost:8082/fruit
Stop the application using CTRL+C

Vá para o URL do navegador -http://localhost:8080/fruit. Voila, a "Página de índice de frutas de boas-vindas!" é exibido.

4. Modelos MVC

Em Jersey, a API MVC consiste em duas classes para vincular o modelo à visualização, a saberViewablee@Template.

Nesta seção, explicaremos três maneiras diferentes de vincular modelos à nossa visão:

  • Usando a classeViewable

  • Usando a anotação@Template 

  • Como lidar com erros com o MVC e passá-los para um modelo específico

4.1. UsandoViewable em uma classe de recurso

Vamos começar observandoViewable:

@Path("/fruit")
public class FruitResource {
    @GET
    public Viewable get() {
        return new Viewable("/index.ftl", "Fruit Index Page");
    }
}

In this example, the FruitResource JAX-RS resource class is the controller. A instânciaViewable encapsula o modelo de dados referenciado que é um simplesString.

Além disso, também incluímos uma referência nomeada ao modelo de visualização associado -index.ftl.

4.2. Usando@Template em um método de recurso

There’s no need to use Viewable every time we want to bind a model to a template.

Neste próximo exemplo, vamos simplesmente anotar nosso método de recurso com@Template:

@GET
@Template(name = "/all.ftl")
@Path("/all")
@Produces(MediaType.TEXT_HTML)
public Map getAllFruit() {
    List fruits = new ArrayList<>();
    fruits.add(new Fruit("banana", "yellow"));
    fruits.add(new Fruit("apple", "red"));
    fruits.add(new Fruit("kiwi", "green"));

    Map model = new HashMap<>();
    model.put("items", fruits);
    return model;
}

Neste exemplo, usamos a anotação@Template. Isso evita envolver nosso modelo diretamente em uma referência de modelo por meio deViewablee torna nosso método de recurso mais legível.

O modelo agora é representado pelo valor de retorno de nosso método de recurso anotado - aMap<String, Object>. Isso é passado diretamente para o modeloall.ftl, que simplesmente exibe nossa lista de frutas.

4.3. Manipulando erros com o MVC

Agora, vamos dar uma olhada em como lidar com erros usando a anotação@ErrorTemplate:

@GET
@ErrorTemplate(name = "/error.ftl")
@Template(name = "/named.ftl")
@Path("{name}")
@Produces(MediaType.TEXT_HTML)
public String getFruitByName(@PathParam("name") String name) {
    if (!"banana".equalsIgnoreCase(name)) {
        throw new IllegalArgumentException("Fruit not found: " + name);
    }
    return name;
}

Generally speaking, the purpose of the @ErrorTemplate annotation is to bind the model to an error view.  Este manipulador de erros cuidará de renderizar a resposta quando uma exceção for lançada durante o processamento de uma solicitação.

Em nosso exemplo simples da API Fruit, se nenhum erro ocorrer durante o processamento, o modelonamed.ftl será usado para renderizar a página. Caso contrário, se uma exceção for levantada, o modeloerror.ftl é mostrado ao usuário.

In this case, the model is the thrown exception itself. Isso significa que de dentro de nosso modelo podemos chamar métodos diretamente no objeto de exceção.

Vamos dar uma olhada rápida em um snippet de nosso modeloerror.ftl para destacar isso:


    

Error - ${model.message}!

Em nosso exemplo final, daremos uma olhada em um teste de unidade simples:

@Test
public void givenGetFruitByName_whenFruitUnknown_thenErrorTemplateInvoked() {
    String response = target("/fruit/orange").request()
      .get(String.class);
    assertThat(response, containsString("Error -  Fruit not found: orange!"));
}

No exemplo acima, usamos a resposta do nosso recurso de frutas. Verificamos se a resposta contém a mensagem deIllegalArgumentException que foi lançada.

5. Conclusão

Neste artigo, exploramos a extensão MVC da estrutura de Jersey.

Começamos apresentando como o MVC funciona em Jersey. Em seguida, vimos como configurar, executar e instalar um exemplo de aplicativo Web.

Por fim, analisamos três maneiras de usar modelos MVC com Jersey e Freemarker e como lidar com erros.

Como sempre, o código-fonte completo do artigo está disponívelover on GitHub.