Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中处理多个http状态错误代码的最佳实践_Java_Http Status Codes - Fatal编程技术网

在java中处理多个http状态错误代码的最佳实践

在java中处理多个http状态错误代码的最佳实践,java,http-status-codes,Java,Http Status Codes,处理多个http状态错误代码的最佳实践是什么,例如,我想处理除404之外的所有4xx和5xx状态代码 我的当前实现如下所示:(我只放置了示例代码) 我知道这是一个非常难看的代码,除了404之外,有谁能建议处理4xx和5xx之间的错误代码的最佳方法吗?使用java程序最好发送特定消息,以获得不同的HTTP状态响应。 看这里: 您还可以使用以下通用方法: public class GenericExceptionMapper implements ExceptionMapper<Throwa

处理多个http状态错误代码的最佳实践是什么,例如,我想处理除404之外的所有4xx和5xx状态代码

我的当前实现如下所示:(我只放置了示例代码)


我知道这是一个非常难看的代码,除了404之外,有谁能建议处理4xx和5xx之间的错误代码的最佳方法吗?使用java程序最好发送特定消息,以获得不同的HTTP状态响应。 看这里:

您还可以使用以下通用方法:

public class GenericExceptionMapper implements ExceptionMapper<Throwable> {

    @Override 
    public Response toResponse(Throwable ex) {

        ErrorMessage errorMessage = new ErrorMessage();     
        setHttpStatus(ex, errorMessage);
        errorMessage.setCode(AppConstants.GENERIC_APP_ERROR_CODE);
        errorMessage.setMessage(ex.getMessage());
        StringWriter errorStackTrace = new StringWriter();
        ex.printStackTrace(new PrintWriter(errorStackTrace));
        errorMessage.setDeveloperMessage(errorStackTrace.toString());
        errorMessage.setLink(AppConstants.BLOG_POST_URL);

        return Response.status(errorMessage.getStatus())
                .entity(errorMessage)
                .type(MediaType.APPLICATION_JSON)
                .build();   
    }

    private void setHttpStatus(Throwable ex, ErrorMessage errorMessage) {
        if(ex instanceof WebApplicationException ) {
            errorMessage.setStatus(((WebApplicationException)ex).getResponse().getStatus());
        } else {
            errorMessage.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); //defaults to internal server error 500
        }
    }
}
公共类GenericeExceptionMapper实现ExceptionMapper{
@凌驾
公众对响应的响应(可丢弃的ex){
ErrorMessage ErrorMessage=新的ErrorMessage();
setHttpStatus(例如,errorMessage);
errorMessage.setCode(AppConstants.GENERIC\u应用程序错误\u代码);
errorMessage.setMessage(例如getMessage());
StringWriter errorStackTrace=新StringWriter();
例如printStackTrace(新的PrintWriter(errorStackTrace));
errorMessage.setDeveloperMessage(errorStackTrace.toString());
errorMessage.setLink(AppConstants.BLOG\u POST\u URL);
返回Response.status(errorMessage.getStatus())
.entity(错误消息)
.type(MediaType.APPLICATION_JSON)
.build();
}
私有void setHttpStatus(可丢弃的ex,ErrorMessage ErrorMessage){
if(WebApplicationException的实例除外){
errorMessage.setStatus(((WebApplicationException)ex).getResponse().getStatus());
}否则{
errorMessage.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());//默认为内部服务器错误500
}
}
}

这可能不是HTTP状态代码的好解决方案,但关于匹配许多可能的值,您可以使用switch语句不间断地将它们全部堆叠起来:

String status = null;
switch (HTTP.STATUS) {
    case 400:
    case 401:
    case 402:
    case 403:
    case 500:
    case 502:
    case 503:
        status = “Failed to send”;
        break;

    default:
        status = "All ok!";
}

大概是这样的:

if (status == 404) {
    // handle 404
} else {
    String sstatus = '' + status;

    switch (sstatus.charAt(0)) {
        case '4':
            // handle 4xx 
            break
        case '5':
            ...

由于可以在Java中打开枚举,请为可能的代码范围定义一个枚举,例如

public enum HttpStatusCodeRange {
SUCCESS_RANGE, CLIENT_ERROR_RANGE, SERVER_ERROR_RANGE, UNKNOWN; }
    HttpStatusCodeRange range = HttpStatusCodeRangeUtil.getRange(response.getStatus());
    switch (range) {
    case SUCCESS_RANGE :
        handleSuccess();
        break;
    case CLIENT_ERROR_RANGE :
        handleClientError();
        break;  
    case SERVER_ERROR_RANGE :
        handleServerError();
        break;  
    case UNKNOWN :
        handleUnexpectedError();
        break;  
    default :
        handleUnknownError();
        break;
    }
然后创建一个实用程序来计算您得到的特定代码的枚举,例如

public static HttpStatusCodeRange getRange(int code) {
    if (code >= 200 && code < 300) {
        return HttpStatusCodeRange.SUCCESS_RANGE;
    } 
    if (code >= 400 && code < 500) {
        return HttpStatusCodeRange.CLIENT_ERROR_RANGE;
    } 
    if (code >= 500 && code < 600) {
        return HttpStatusCodeRange.SERVER_ERROR_RANGE;
    } 
    return HttpStatusCodeRange.UNKNOWN;
}

我认为这是一个很好的例子,说明OOP有点过头了。使用switch语句。但您不应该因为将多个错误合并为一个错误而丢失信息。使代码成为状态的一部分。
    HttpStatusCodeRange range = HttpStatusCodeRangeUtil.getRange(response.getStatus());
    switch (range) {
    case SUCCESS_RANGE :
        handleSuccess();
        break;
    case CLIENT_ERROR_RANGE :
        handleClientError();
        break;  
    case SERVER_ERROR_RANGE :
        handleServerError();
        break;  
    case UNKNOWN :
        handleUnexpectedError();
        break;  
    default :
        handleUnknownError();
        break;
    }