自定义Jersey错误处理,如何在客户端捕获响应



我正在尝试在我的webservice上进行一些自定义错误处理。在我的web服务中,我创建了一个自定义Exception类,扩展了JAX-RS/Jersey中描述的WebApplicationException,如何自定义错误处理?:

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服务,它提供了一个国家列表。我确定会出现一个错误来测试internalservererroreexception的抛出:
@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在客户端。

是否有一种方法可以在客户端(在catch块中)获得errorMessage,而不使用Response作为返回类型?

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

是否有一种方法可以在客户端(在catch块中)获得errorMessage而不使用Response作为返回类型?

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

public List<Country> 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<List<Country>>(){});
    }
}

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

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;
}

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

但是,您可以在服务器代码中抛出异常,然后捕获它们并使用ExceptionMapper将它们转换为有效响应。

最新更新