从抛出的自定义异常中获取自定义消息

时间:2017-08-03 20:07:16

标签: post http-status-code-404 dropwizard

我正在为我的一个资源

编写一个post方法的测试
@POST
@Path("/api")
@Timed
@UnitOfWork
@Consumes(MediaType.APPLICATION_JSON)

public Person createPerson(Person p, @Context UriInfo uriInfo) {
      //do something here or throw 400 exception

}

这是测试

@Test
public void testThrows400() throws Exception {

thrown.expect(400Exception.class);
Response response = resources.client().target("/api").request(MediaType.APPLICATION_JSON).post(Entity.entity(person, MediaType.APPLICATION_JSON_TYPE));
assertEquals(response.getStatus(), 400);
assertEquals(response.getStatusInfo(), Status.BAD_REQUEST);

}

这是按预期工作的。但有没有办法可以在抛出异常时返回我发送的自定义消息?

这是异常类

public class InvalidNameException  extends WebApplicationException
{
    private static final long serialVersionUID = 1L;


    public InvalidNameException(URI location)
    {
        this(location, null);
    }
    public InvalidNameException(URI location, Object entity) {
         super(Response.status(Status.BAD_REQUEST).location(location).entity("Invalid name, please use a valid name").build());
    }


}

1 个答案:

答案 0 :(得分:0)

您可以使用类似的代码块,发送的响应将包含HTTP状态400以及您的自定义消息。

首先,添加一个构造函数,将您的消息作为输入。

public InvalidNameException(String message) {
    super(message);
}
if (invalidName) throw new InvalidNameException("My custom message goes here");

除此之外,请使用ExceptionMapper。

public class InvalidNameMapper implements ExceptionMapper<InvalidNameException> {
    @Override
    public Response toResponse(InvalidNameException e) {
        return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
    }
}

您需要在框架中注册InvalidNameMapper。 对于Dropwizard,您可以在应用程序类的run()方法中执行以下操作。

environment.jersey().register(InvalidNameMapper.class);