在开发过程中,有时候会需要使用错误码+错误信息的形式,来返回某些业务操作的错误结果信息,来代替效率较低的异常传递。
这样就需要封装一个统一的Result model作为返回值,代替直接返回数据等结果。
1.定义错误码 - 错误信息接口
错误码可能是String、Integer、Long 等类型,也可能是enum类型。因此这里使用泛型来代替,错误码类型,可以提高灵活性
。也可以通过枚举直接实现CodeMessage接口。
public interface CodeMessage{
C getCode();
String getMessage();
}
2.实现Result Model
这里定义的是service层的Result。有时候在controller层只会作一些简单的参数校验,在service层会作进一步的校验,
如果controller中需要统一返回一个JsonResult可以将ServiceResult作一个简单的转换器进行转换。
public class ServiceResult implements Serializable {
public static final CodeMessage SUCCESS = new DefaultMessage<>("00000000", "success");
private T data;
private CodeMessage message;
private boolean isSuccess;
ServiceResult(T data, boolean isSuccess, CodeMessage message) {
this.data = data;
this.message = message;
this.isSuccess = isSuccess;
}
public T getData() {
return data;
}
public CodeMessage getCodeMessage() {
return message;
}
public boolean isSuccess() {
return isSuccess;
}
public static ServiceResultBuilder success() {
ServiceResultBuilder builder = builder();
return builder.isSuccess(true);
}
public static ServiceResultBuilder success(CodeMessage codeMessage) {
ServiceResultBuilder builder = builder();
return builder.isSuccess(true).code(codeMessage.getCode()).message(codeMessage.getMessage());
}
public static ServiceResult success(D data) {
ServiceResultBuilder success = success(SUCCESS);
return success.data(data).build();
}
public static ServiceResult error(CodeMessage codeMessage) {
ServiceResultBuilder builder = builder();
return builder.isSuccess(false).code(codeMessage.getCode()).message(codeMessage.getMessage()).build();
}
public static ServiceResultBuilder error() {
ServiceResultBuilder builder = builder();
return builder.isSuccess(false);
}
static ServiceResultBuilder builder() {
return new ServiceResultBuilder<>();
}
public static class DefaultMessage implements CodeMessage, java.io.Serializable {
private C code;
private String message;
public DefaultMessage(C code, String message) {
this.code = code;
this.message = message;
}
@Override
public C getCode() {
return code;
}
@Override
public String getMessage() {
return message;
}
@Override
public String toString() {
return "DefaultMessage{" +
"code=" + code +
", message='" + message + '\'' +
'}';
}
}
public static class ServiceResultBuilder {
private T data;
private C code;
private String message;
private boolean isSuccess;
ServiceResultBuilder() { //package private
}
public ServiceResultBuilder data(T data) {
this.data = data;
return this;
}
ServiceResultBuilder isSuccess(boolean isSuccess) {
this.isSuccess = isSuccess;
return this;
}
public ServiceResultBuilder code(C code) {
this.code = code;
return this;
}
public ServiceResultBuilder message(String message) {
this.message = message;
return this;
}
public ServiceResult build() {
Objects.requireNonNull(code, "code");
Objects.requireNonNull(code, "message");
return new ServiceResult<>(data, isSuccess, new DefaultMessage<>(code, message));
}
}
@Override
public String toString() {
return "ServiceResult{" +
"data=" + data +
", message=" + message +
", isSuccess=" + isSuccess +
'}';
}
}
3.使用
定义枚举错误码
pubilc enum CodeMessageEnum implements CodeMessage {
some_error(1001, "错误信息。");
Integer code;
String message;
CodeMessageEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
@Override
public Integer getCode() {
return code;
}
@Override
public String getMessage() {
return message;
}
}
//返回正确结果带返回值。
ServiceResult, String> s = ServiceResult.success(Arrays.asList("1", "2", "3"));
s.isSuccess(); //true
ServiceResult, Integer> e1 = ServiceResult.error(CodeMessageEnum.some_error);
e1.isSuccess(); //false
ServiceResult, Long> e2 = ServiceResult.error(new ServiceResult.DefaultMessage<>(1000L, "error"));
e2.isSuccess(); //false
//ServiceResult{data=[1, 2, 3], message=DefaultMessage{code=00000000, message='success'}, isSuccess=true}
System.out.println(s);
//ServiceResult{data=null, message=DefaultMessage{code=1001, message='错误信息。'}, isSuccess=false}
System.out.println(e1);
//ServiceResult{data=null, message=DefaultMessage{code=1000, message='error'}, isSuccess=false}
System.out.println(e2);
补充知识:java 封装返回结果实体类 返回结果以及错误信息
我就废话不多说了,大家还是直接看代码吧~
public class ResponseMessage {
private final static String STATUS_OK = "0";
private final static String STATUS_ERROR = "1";
private String status; // 状态
private Object data; // 返回值
private Exception e; // 异常类捕获
private String msg; // 自定义信息
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Exception getE() {
return e;
}
public void setE(Exception e) {
this.e = e;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public ResponseMessage() {
super();
}
public ResponseMessage(String status, Object data, Exception e, String msg) {
super();
this.status = status;
this.data = data;
this.e = e;
this.msg = msg;
}
/**
* 成功的结果
* @param data 返回结果
* @param msg 返回信息
*/
public static ResponseMessage newOkInstance(Object data, String msg) {
return new ResponseMessage(ResponseMessage.STATUS_OK, data, null, msg);
}
/**
* 成功的结果
* @param data 返回结果
*/
public ResponseMessage newOkInstance(Object data) {
return new ResponseMessage(ResponseMessage.STATUS_OK, data, null, null);
}
/**
* 失败的结果
* @param msg 返回信息
*/
public static ResponseMessage newErrorInstance(String msg) {
return new ResponseMessage(ResponseMessage.STATUS_ERROR, null, null, msg);
}
/**
* 失败的结果
* @param e 异常对象
* @param msg 返回信息
*/
public static ResponseMessage newErrorInstance(Exception e, String msg) {
return new ResponseMessage(ResponseMessage.STATUS_ERROR, null, e, msg);
}
}
以上这篇Java封装统一的Result Model案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持自学编程网。