java-自定义球衣错误处理,如何在客户端捕获响应?

我正在尝试在Web服务上进行一些自定义错误处理.在我的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()方法时,我都会在输出窗口中看到以下信息:信息:我希望此消息在服务器端的客户端显示,并在客户端显示HTTP 500 Internal Server Error.

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

我要实现的目标如下:当客户端发生错误时,用户可以将调试报告发送到我的JIRA实例,其中包含大量信息,例如客户端的stacktrace,有关系统的其他信息,登录,…最好也将服务器的stacktrace附加到那里.还是有更好的方法实现这一目标?

解决方法:

Is there a way to get the errorMessage on the client side (in the catch block) without using Response as a return type?

您可以使用response.readEntity(new GenericType< List< Country>>(){}).这样,您仍然可以访问响应.虽然在这种情况下将没有堆栈跟踪.当您尝试使用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;
}
上一篇:java-注入实例上的Guice nullpointer异常


下一篇:java-如何在http 302响应中删除授权标头