自定义Jerseyerror handling,如何在客户端捕获响应?

我正在尝试在我的webservice上进行一些自定义error handling。 在我的webservice中,我创建了一个自定义的Exception类,扩展了WebApplicationException,如JAX-RS / Jersey中所描述的, 如何自定义error handling? :

public class InternalServerErrorException extends WebApplicationException { public InternalServerErrorException(String message) { super(Response.status(Response.Status.INTERNAL_SERVER_ERROR) .header("errorMessage", message).type(MediaType.TEXT_PLAIN).build()); System.out.println(message); } } 

为了测试,我有一个简单的国家/地区服务,它提供了一个国家列表。 我确保测试抛出InternalServerErrorException会发生错误:

 @GET @Override @Path("countries") @Produces({"application/xml"}) public List findAll() { try { int i = Integer.parseInt("moo"); //<-- generate error List countries = super.findAll(); return countries; } catch (Exception ex) { throw new InternalServerErrorException("I want this message to show at client side"); } } 

在我的客户端,我有一个CountryClient与以下方法:

 public List findAll() throws ClientErrorException { WebTarget resource = webTarget; resource = resource.path("countries"); return resource.request(javax.ws.rs.core.MediaType.APPLICATION_XML).get(new GenericType<List>(){}); } 

在我的控制器中我使用它像这样:

  try { CountryClientSSL cc = new CountryClientSSL(); cc.setUsernamePassword(USERNAME, PASSWORD); ObservableList olCountries = FXCollections.observableArrayList(cc.findAll()); tblCountries.setItems(olCountries); tcCountry.setSortType(SortType.ASCENDING); tblCountries.getSortOrder().add(tcCountry); } catch (Exception ex) { System.out.println(ex.getMessage()); } 

因此每次我在客户端使用findAll()方法时,我会在输出窗口中看到以下信息: Info: I want this message to show at client side在服务器端的Info: I want this message to show at client side端,以及Info: I want this message to show at client side HTTP 500 Internal Server Error

有没有办法在客户端(在catch块中)获取errorMessage而不使用Response作为返回类型?

我想要实现的目标如下:当客户端发生错误时,用户可以将调试报告发送到我的JIRA实例,其中包含很多信息,如客户端的堆栈跟踪,有关系统的额外信息,谁是登录,…也可以将服务器的堆栈跟踪附加在那里。 或者有更好的方法来实现这一目标吗?

有没有办法在客户端(在catch块中)获取errorMessage而不使用Response作为返回类型?

您可以使用response.readEntity(new GenericType>(){}) 。 这样您仍然可以访问Response 。 虽然在这种情况下不会有堆栈跟踪。 当您尝试使用get(ParsedType)时,客户端上只有一个例外。 原因是使用get(ParsedType) ,没有其他方法可以处理错误状态。 但是使用Response ,开发人员应该对状态进行检查。 所以这个方法看起来更像

 public List findAll() throws ClientErrorException { WebTarget resource = webTarget; resource = resource.path("countries"); Response response = resource.request(javax.ws.rs.core.MediaType.APPLICATION_XML).get(); if (response.getStatus() != 200) { System.out.println(response.getHeaderString("errorResponse")); return null; } else { return response.readEntity(new GenericType>(){}); } } 

虽然不是在标题中,但我只是将消息作为响应主体发送出去。 这就是我

 super(Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity( message).type(MediaType.TEXT_PLAIN).build()); 

客户端

 if (response.getStatus() != 200) { System.out.println(response.readEntity(String.class)); return null; } 

我不相信你可以在除HTTP 200( Response.ok().build )之外的任何响应类型中返回自定义内容(即errorMessage )。

但是,您可以在服务器代码中抛出exception,然后捕获它们并使用ExceptionMapper将它们转换为有效的响应。 有关详细信息,请参阅此问题 。