【发布时间】:2016-01-19 05:23:12
【问题描述】:
我正在我的网络服务上尝试一些自定义错误处理。在我的 Web 服务中,我创建了一个自定义 Exception 类,该类扩展 WebApplicationException,如 JAX-RS / Jersey how to customize 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);
}
}
为了进行测试,我有一个简单的 Country 服务,它提供了国家/地区列表。我确定会发生错误来测试 InternalServerErrorException 的抛出:
@GET
@Override
@Path("countries")
@Produces({"application/xml"})
public List<Country> findAll() {
try {
int i = Integer.parseInt("moo"); //<-- generate error
List<Country> countries = super.findAll();
return countries;
} catch (Exception ex) {
throw new InternalServerErrorException("I want this message to show at client side");
}
}
在我的客户那里,我有一个 CountryClient,方法如下:
public List<Country> findAll() throws ClientErrorException {
WebTarget resource = webTarget;
resource = resource.path("countries");
return resource.request(javax.ws.rs.core.MediaType.APPLICATION_XML).get(new GenericType<List<Country>>(){});
}
在我的控制器中我是这样使用它的:
try {
CountryClientSSL cc = new CountryClientSSL();
cc.setUsernamePassword(USERNAME, PASSWORD);
ObservableList<Country> 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 在服务器端,HTTP 500 Internal Server Error 在客户端。
有没有办法在不使用Response 作为返回类型的情况下在客户端(在catch 块中)获取errorMessage?
我想要实现的是:当客户端发生错误时,用户可以向我的 JIRA 实例发送调试报告,其中包含大量信息,例如客户端的堆栈跟踪、有关系统,谁已登录,... 将服务器的堆栈跟踪也附在其中会很好。还是有更好的方法来实现这一目标?
【问题讨论】:
-
是否有不能从服务器端向JIRA提交异常的原因?到目前为止,这将是上传所有异常详细信息的最简单方法。否则,您必须将其序列化为 JSON 或其他格式,以便客户端可以执行此操作。
-
基本上是因为我想把客户端错误信息和服务器端错误信息联系起来。我能做的是从服务器端创建一个 JIRA 问题,然后将唯一键作为 errorMessage 并将其链接到在客户端创建的问题......但是我仍然需要在客户端获取 errorMessage 字符串。这会导致 2 个问题对应一个实际问题...
-
对于 Jersey 2,如果有人想抑制 500 响应代码上的异常,请参阅此答案:stackoverflow.com/a/31360598/403999
标签: java web-services rest error-handling jersey