2017-08-03 128 views
0

我寫帖子的方法測試了我的資源獲取自定義消息出來拋出自定義異常的

@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

您可以使用類似的代碼塊,併發送將與您的自定義消息一起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);