从引发的自定义异常中获取自定义消息



我正在为我的一个资源编写一个帖子方法的测试

@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());
}

}

您可以使用类似的代码块,发送的响应将具有 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);

最新更新