Java封装统一的Result Model案例

在开发过程中,有时候会需要使用错误码+错误信息的形式,来返回某些业务操作的错误结果信息,来代替效率较低的异常传递。

这样就需要封装一个统一的Result model作为返回值,代替直接返回数据等结果。

1.定义错误码 - 错误信息接口

错误码可能是String、Integer、Long 等类型,也可能是enum类型。因此这里使用泛型来代替,错误码类型,可以提高灵活性

。也可以通过枚举直接实现CodeMessage接口。

public interface CodeMessage<C>{
  C getCode();
  String getMessage();
}

2.实现Result Model

这里定义的是service层的Result。有时候在controller层只会作一些简单的参数校验,在service层会作进一步的校验,

如果controller中需要统一返回一个JsonResult可以将ServiceResult作一个简单的转换器进行转换。

public class ServiceResult<T, C> implements Serializable {

  public static final CodeMessage<String> SUCCESS = new DefaultMessage<>("00000000", "success");

  private T data;
  private CodeMessage<C> message;
  private boolean isSuccess;

  ServiceResult(T data, boolean isSuccess, CodeMessage<C> message) {
    this.data = data;
    this.message = message;
    this.isSuccess = isSuccess;
  }

  public T getData() {
    return data;
  }

  public CodeMessage<C> getCodeMessage() {
    return message;
  }

  public boolean isSuccess() {
    return isSuccess;
  }

  public static <D, C> ServiceResultBuilder<D, C> success() {
    ServiceResultBuilder<D, C> builder = builder();
    return builder.isSuccess(true);
  }

  public static <D, C> ServiceResultBuilder<D, C> success(CodeMessage<C> codeMessage) {
    ServiceResultBuilder<D, C> builder = builder();
    return builder.isSuccess(true).code(codeMessage.getCode()).message(codeMessage.getMessage());
  }

  public static <D> ServiceResult<D, String> success(D data) {
    ServiceResultBuilder<D, String> success = success(SUCCESS);
    return success.data(data).build();
  }

  public static <D, C> ServiceResult<D, C> error(CodeMessage<C> codeMessage) {
    ServiceResultBuilder<D, C> builder = builder();
    return builder.isSuccess(false).code(codeMessage.getCode()).message(codeMessage.getMessage()).build();
  }

  public static <D, C> ServiceResultBuilder<D, C> error() {
    ServiceResultBuilder<D, C> builder = builder();
    return builder.isSuccess(false);
  }

  static <D, C> ServiceResultBuilder<D, C> builder() {
    return new ServiceResultBuilder<>();
  }

  public static class DefaultMessage<C> implements CodeMessage<C>, 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<T, C> {

    private T data;
    private C code;
    private String message;
    private boolean isSuccess;

    ServiceResultBuilder() { //package private
    }

    public ServiceResultBuilder<T, C> data(T data) {
      this.data = data;
      return this;
    }

    ServiceResultBuilder<T, C> isSuccess(boolean isSuccess) {
      this.isSuccess = isSuccess;
      return this;
    }

    public ServiceResultBuilder<T, C> code(C code) {
      this.code = code;
      return this;
    }

    public ServiceResultBuilder<T, C> message(String message) {
      this.message = message;
      return this;
    }

    public ServiceResult<T, C> 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<Integer> {
  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<List<String>, 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案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java方法通用返回结果集封装操作

    我们在封装方法的时候,有的时候除了需要返回数据结果集data,有的时候需要返回code(或者status) 或者 msg , 此时可以采取下面两种方式进行封装方法的返回值: 一.返回结果使用HashMap接收 1.方法中的数据封装到hashmap中 public Map<String,Object> result(Object object) { Map<String,Object> result = new HashMap<String, Object>(); res

  • 使用java反射将结果集封装成为对象和对象集合操作

    java反射机制是什么 反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法: 反射机制能够做什么 1.判断运行对象的所属类 2.构造任意一个类的对象 3.获取任意一个类的属性和方法 4.调用任意属性和方法 5.生成动态代理 利用反射将结果集封装成为对象或者集合(实测可用) package coral.base.util; import java.beans.IntrospectionException; import java.beans.PropertyDescri

  • Java 通过反射给实体类赋值操作

    表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了, 怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题. 所以就有了这样一个类,只需把request和实体类对象传进去就行了, 这样就会得到一个有值的实体类对象 下面是代码示例 import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.Date; import ja

  • Java封装统一的Result Model案例

    在开发过程中,有时候会需要使用错误码+错误信息的形式,来返回某些业务操作的错误结果信息,来代替效率较低的异常传递. 这样就需要封装一个统一的Result model作为返回值,代替直接返回数据等结果. 1.定义错误码 - 错误信息接口 错误码可能是String.Integer.Long 等类型,也可能是enum类型.因此这里使用泛型来代替,错误码类型,可以提高灵活性 .也可以通过枚举直接实现CodeMessage接口. public interface CodeMessage<C>{ C ge

  • Java struts2请求源码分析案例详解

    Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定.性能优异.设计成熟的WEB框架. 我这里的struts2源码是从官网下载的一个最新的struts-2.3.15.1-src.zip,将其解压即可.里面的目录页文件非常的多,我们只需要定位到struts-2.3.15.1\src\core

  • java设计模式责任链模式原理案例详解

    目录 引言 责任链模式定义 类图 角色 核心 示例代码 1.对请求处理者的抽象 2.对请求处理者的抽象 3.责任链的创建 责任链实现请假案例 案例类图 可扩展性 纯与不纯的责任链模式 纯的责任链模式 不纯的责任链模式 责任链模式主要优点 职责链模式的主要缺点 适用场景 模拟实现Tomcat中的过滤器机制 运行过程如下 分析Tomcat 过滤器中的责任链模式 引言 以请假流程为例,一般公司普通员工的请假流程简化如下: 普通员工发起一个请假申请,当请假天数小于3天时只需要得到主管批准即可:当请假天数

  • Java接口统一样式返回模板简介

    这篇文章主要介绍了Java接口统一样式返回模板简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景 在进行接口开发时,一般需要一个固定的返回样式,成功和失败的时候,都按照这种格式来进行统一的返回,这样,在与其他人进行接口之间的联调时不会显得很杂乱无章.而这种固定的格式如果放在Java的每个接口单独处理时,又会在接口开发时很繁琐,所以这个时候可以采用封装一个实体类,统一返回固定模板格式的内容. 封装模板 先看一下没有封装之前,接口代码和返回格

  • Java使用easyExcel导出excel数据案例

    easyExcel简介: Java领域解析.生成Excel比较有名的框架有Apache poi.jxl等.但他们都存在一个严重的问题就是非常的耗内存.如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc. easyExcel是阿里巴巴开源的一个excel处理框架,以使用简单.节省内存著称. easyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理 easyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据

  • 浅谈SpringBoot如何封装统一响应体

    一.前言 在上一篇 SpringBoot 参数校验中我们对参数校验添加了异常处理,但是还是有不规范的地方,没有用统一响应体进行返回,在这篇文章中介绍如何封装统一响应体. 关于统一响应体的封装,没有一个标准答案,我在各种技术社区看了一遍,汇总了一个复用性比较好的方案. 二.添加结果类枚举 在项目目录下面建一个 responseEntity 的 package,然后在里面建一个 ResultEnum 枚举类,添加如下代码: 这边介绍一下枚举类的用法.枚举类的作用实际上就是定义常量,如果不使用枚举类,

  • Java jpa外连接查询join案例详解

    1.IndexTagController.java @GetMapping("/tags/{id}") public String types(@PageableDefault(size = 3,sort = {"updateTime"},direction = Sort.Direction.DESC)Pageable pageable, @PathVariable long id, Model model, HttpSession session){ //找到所有

  • Java静态代理与动态代理案例详解

    代理模式 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问. 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上.在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层. 代理模式的元素是:共同接口.代理对象.目标对象. 代理模式的行为:由代理对象执行目标对象的方法.由代理对象扩展目标对象的方法. 代理模式的

  • Java Pattern与Matcher字符串匹配案例详解

    Pattern类定义          public final class Pattern extends Object implementsSerializable正则表达式的编译表示形式.用于编译正则表达式后创建一个匹配模式.         指定为字符串的正则表达式必须首先被编译为此类的实例.然后,可将得到的模式用于创建Matcher对象,依照正则表达式,该对象可以与任意字符序列匹配.执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式.         因此,典型的

  • Java 封装的使用详解

    目录 1. 基本介绍 2. 封装介绍 3. 封装的理解和好处 4. 封装的实现步骤 (三步) 5. 快速入门案例 6. 将构造器和 setXxx 结合 7. 练习 1. 基本介绍 面向对象编程有三大特征:封装.继承和多态. 2. 封装介绍 3. 封装的理解和好处 4. 封装的实现步骤 (三步) 5. 快速入门案例 package com.xdr630.encap; public class Encapsulation01 { public static void main(String[] ar

随机推荐