我正在为我的一个资源
编写一个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());
}
}
答案 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);