Dropwizard series: clase Configuration

Comienzo otra serie de post, esta vez sobre Dropwizard, para el que ya hice un poc en un post previo. En este caso explicaré como cargar fácilmente un archivo yaml como configuración en Dropwizard, directamente en su clase Configuration, y como usarlo.

Concepto

Como vimos en el anterior post sobre Dropwizard, montar un proyecto con él consta de unos pocos pasos, entre ellos tener una clase Application, que es la clase principal que arranca nuestro servidor. Esta clase debe estar parametrizada con la clase de configuración Configuration. En el ejemplo anterior la dejamos vacía, pero en este caso vamos a ver como añadir fácilmente parámetros de configuración a nuestra aplicación.

Vamos a añadirle un par de parámetros de configuración a nuestro poc, los cuales usaremos desde nuestro resource hello-world.

Entorno usado:
Java JDK 1.8
Maven 3.3.9
Git 2.6.3
IDE Intellij 2016.1.3 Ultimate version

Pasos:

1. Usaremos como base el mismo proyecto del anterior post de dropwizard, podéis descargarlo de aquí.

2. Añadimos en nuestra clase de configuración dos atributos nuevos:

package com.edwise.pocs.dropwizardseries.configurationclass.config;

// imports...

public class DropwizardConfig extends Configuration {

  @NotEmpty
  private String host;

  private String defaultName;

  public String getHost() {
  return host;
  }

  public void setHost(String host) {
  this.host = host;
  }

  public String getDefaultName() {
  return defaultName;
  }

  public void setDefaultName(String defaultName) {
  this.defaultName = defaultName;
  }
}

Tendremos 2 parámetros, uno con el host y otro con un nombre por defecto para el mensaje de «hello world».
Como vemos. para añadir parámetros a nuestra configuración basta con añadir atributos en nuestra clase Configuration, y crearle sus getters y setters. Jackson se encarga del parseo, de manera trasparente.
En el caso del host, por ejemplo, hemos puesto que sea un parámetro obligatorio (con el @NotEmpty de hibernate validations). Si nuestra configuración no tiene valor para ese parámetro, dará error el arranque.

3. Añadimos nuestro yaml con los dos parámetros de configuración, bajo el directorio ‘src/main/resources’ (puede ser en cualquier otro directorio, no es obligatorio):

host: localhost
defaultName: Nobody

Con esto ya automáticamente dropwizard cargará esos datos en nuestra clase Configuration.

4. Ahora vamos a usar los parámetros desde la aplicación: en nuestro MessageResource le añadimos un constructor que reciba esos dos datos, y cambiamos el formato del mensaje que devolvemos:

package com.edwise.pocs.dropwizardseries.configurationclass.resource;

import com.edwise.pocs.dropwizardseries.configurationclass.model.Message;

// imports...

@Path("/hello-world")
@Produces(MediaType.APPLICATION_JSON)
public class MessageResource {
  private static final String HELLO_WORLD_SENTENCE = "Hello world %s, from %s!";

  private final String host;
  private final String defaultName;

  public MessageResource(String host, String defaultName) {
  this.host = host;
  this.defaultName = defaultName;
  }

  @GET
  public Message getHelloWorldMessage(@QueryParam("name") String name) {
  return new Message(String.format(HELLO_WORLD_SENTENCE,
  name != null ? name : defaultName, host));
  }
}

En el mensaje mostraremos tanto el nombre recibido (o el nombre por defecto si no) como el host.

5. En nuestra clase Application de dropwizard, modificamos el punto donde registramos el resource, pasándole los datos desde la clase Configuration:

package com.edwise.pocs.dropwizardseries.configurationclass;

// imports...

public class DropwizardApplication extends Application<DropwizardConfig> {

  public static void main(String[] args) throws Exception {
  new DropwizardApplication().run(args);
  }

  @Override
  public void run(DropwizardConfig dropwizardConfig, Environment environment) {
  environment.jersey()
  .register(new MessageResource(dropwizardConfig.getHost(),
  dropwizardConfig.getDefaultName()));
  }
}

El objeto ‘dropwizardConfig’ recibido como parámetro en el método ‘run’ contiene ya los datos recogidos del yaml. Se los pasamos como parámetro al resource, y listo.

6. Solo falta arrancar y probar. Pero para que dropwizard procese el yaml, tenemos que pasárselo como parámetro al arrancar, de la siguiente manera:

java -jar target/dropwizard-series-configuration-class-1.0.0-SNAPSHOT.jar server src/main/resources/config.yaml

Si tenemos configurado un ‘Run configuration’ en Intellij para arrancarlo, también debemos añadir la ruta del yaml como segundo parámetro, de la misma manera.

7. Si ahora lanzamos una petición GET http://localhost:8080/hello-world contra nuestro servidor nos devolverá algo como esto:

{
  "message": "Hello world Nobody, from localhost!"
}

Todo el código de este post lo tenéis en mi github, proyecto dropwizard-series-configuration-class.