package io.dropwizard.setup;
import com.codahale.metrics.MetricRegistry;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.io.Resources;
import io.dropwizard.configuration.YamlConfigurationFactory;
import io.dropwizard.jackson.Jackson;
import io.dropwizard.jersey.validation.JerseyViolationException;
import io.dropwizard.jetty.HttpConnectorFactory;
import io.dropwizard.logging.ConsoleAppenderFactory;
import io.dropwizard.logging.FileAppenderFactory;
import io.dropwizard.logging.SyslogAppenderFactory;
import io.dropwizard.server.ServerFactory;
import io.dropwizard.server.SimpleServerFactory;
import io.dropwizard.validation.BaseValidator;
import org.eclipse.jetty.server.AbstractNetworkConnector;
import org.eclipse.jetty.server.Server;
import org.hibernate.validator.constraints.NotEmpty;
import org.junit.Before;
import org.junit.Test;
import javax.validation.Validator;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import java.io.File;
import static io.dropwizard.server.SimpleServerFactoryTest.httpRequest;
import static org.assertj.core.api.Assertions.assertThat;
public class ExceptionMapperBinderTest {
private SimpleServerFactory http;
private final ObjectMapper objectMapper = Jackson.newObjectMapper();
private Validator validator = BaseValidator.newValidator();
private Environment environment = new Environment("testEnvironment", objectMapper, validator, new MetricRegistry(),
ClassLoader.getSystemClassLoader());
@Before
public void setUp() throws Exception {
objectMapper.getSubtypeResolver().registerSubtypes(ConsoleAppenderFactory.class,
FileAppenderFactory.class, SyslogAppenderFactory.class, HttpConnectorFactory.class);
http = (SimpleServerFactory) new YamlConfigurationFactory<>(ServerFactory.class, validator, objectMapper, "dw")
.build(new File(Resources.getResource("yaml/simple_server.yml").toURI()));
}
@Test
public void testOverrideDefaultExceptionMapper() throws Exception {
environment.jersey().register(new TestValidationResource());
environment.jersey().register(new MyJerseyExceptionMapper());
final Server server = http.build(environment);
server.start();
final int port = ((AbstractNetworkConnector) server.getConnectors()[0]).getLocalPort();
assertThat(httpRequest("GET", "http://localhost:" + port + "/service/test")).isEqualTo("alright!");
server.stop();
}
private static class MyJerseyExceptionMapper implements ExceptionMapper<JerseyViolationException> {
@Override
public Response toResponse(JerseyViolationException e) {
return Response.ok("alright!").build();
}
}
@Path("/test")
@Produces("application/json")
private static class TestValidationResource {
@GET
public String get(@NotEmpty @QueryParam("foo") String foo) {
return foo;
}
}
}