在java中处理多个http状态错误代码的最佳实践
处理多个http状态错误代码的最佳实践是什么,例如,我想处理除404之外的所有4xx和5xx状态代码 我的当前实现如下所示:(我只放置了示例代码)在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
我知道这是一个非常难看的代码,除了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;
}