Skip to content

Upgrade guide 0.7.x to 0.8.x

Artem Prigoda edited this page May 22, 2015 · 16 revisions

First

Check out Migration discussion 0.7.1 to 0.8.0 at the dropwizard-dev mailing list.

Important Information

This guide is not complete. I wrote down my personal experience upgrading a simple application from Dropwizard 0.7.1 to 0.8.0. Please feel free to modify this page and add more hints!

Migration of Apache Commons Lang

The classes were moved to a new package. You have to update the corresponding imports:

search for: org.apache.commons.lang.
replace with: org.apache.commons.lang3.

Use assertions from AssertJ

Instead of the FEST assertions you should use the AssertJ assertions:

search for: org.fest.assertions.api.Assertions.
replace with: org.assertj.core.api.Assertions.

Migration of custom URL pattern

If you set a custom URL pattern in your application run method you should move the definition to your configuration file:

Remove from Java code (example):

environment.jersey().setUrlPattern("/api/*");

Add to configuration file (example):

server:
  rootPath: '/api/*'

Migration of Jersey

This is not a simple search and replace migration, so I show you a few examples of often used code snippets for integration testing:

Dropwizard Class Rule

The class rule was not modified. It is shown here because it is used in the examples below.

@ClassRule
public static final DropwizardAppRule<SportChefConfiguration> RULE = 
                    new DropwizardAppRule<>(App.class, "config.yaml");

Executing a GET request

final WebTarget target = ClientBuilder.newClient().target(
        String.format("http://localhost:%d/api/user/1", RULE.getLocalPort()));

final Response response = target
        .request(MediaType.APPLICATION_JSON_TYPE)
        .accept(MediaType.APPLICATION_JSON_TYPE)
        .get();

assertThat(response.getStatus()).isEqualTo(Response.Status.OK.getStatusCode());

final User user = response.readEntity(User.class);
assertThat(user.getId()).isEqualTo(1L);
assertThat(user.getFirstName()).isEqualTo("John");
assertThat(user.getLastName()).isEqualTo("Doe");

Executing a POST request

final WebTarget target = ClientBuilder.newClient().target(
        String.format("http://localhost:%d/api/user", RULE.getLocalPort()));

final User user = new User(0L, "John", "Doe");

final Response response = target
        .request(MediaType.APPLICATION_JSON_TYPE)
        .accept(MediaType.APPLICATION_JSON_TYPE)
        .post(Entity.json(user));

assertThat(response.getStatus()).isEqualTo(Response.Status.CREATED.getStatusCode());

final URI location = response.getLocation();
assertThat(location).isNotNull();

final String path = location.getPath();
final long newId = Long.parseLong(path.substring(path.lastIndexOf("/") + 1));
assertThat(newId).isGreaterThan(0);

Executing a empty PUT request

Jersey 2 does not by default allow empty PUT or DELETE requests. If you want to enable this, you have to add a configuration parameter

Client client = ClientBuilder.newClient();
client.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
WebTarget target = client.target(
        String.format("http://localhost:%d/api/user", RULE.getLocalPort()));

Response response = target
        .request()
        .put(null);

assertThat(response.getStatus()).isEqualTo(Response.Status.OK.getStatusCode());

Request/response filters

If you previously used jersey container filters in your Dropwizard app, getContainerRequestFilters() will now fail to resolve:

env.jersey()
.getResourceConfig()
.getContainerRequestFilters()
.add(new AuthorizedFilter());

You might need to rewrite the filter to JAX-RS 2.0 and then you may use the one and only .register() instead.

My filters used imports from jersey.spi.container and needed to be rewritten for Jersey 2.x. See [this] (https://jersey.java.net/documentation/latest/user-guide.html#d0e9571).

env.jersey().register(new AuthorizationFilter());