java model 封装_Java封装统一的Result Model案例

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

这样就需要封装一个统一的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案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持龙方网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 日期随机数_Java 生成指定时间范围的随机时间、随机中文姓名、随机字符姓名、随机数...

解决问题&#xff1a;Java生成指定时间范围的随机时间&#xff1f;Java生成随机中文姓名&#xff1f;Java生成随机字符姓名&#xff1f;Java生成随机数&#xff1f;代码&#xff1a;import java.io.UnsupportedEncodingException;import java.text.ParseException;import java.…

java语言程序设计基础篇14.6答案_《Java语言程序设计-基础篇》答案-第15章

第15章 异常和断言复习题15.1 答&#xff1a;略15.2 答&#xff1a;声明异常是为了在方法中产生异常时&#xff0c;以便通知方法的调用者。在方法声明的头部使用关键字throws 声明&#xff0c;一个方法可以声明多个异常。如&#xff1a;public void method() throws IOExceptio…

《机器学习》周志华 习题答案9.4

原题采用Kmeans方法对西瓜数据集进行聚类。我花了一些时间居然没找到西瓜数据集4.0在哪里&#xff0c;于是直接采用sklearn给的例子来分析一遍&#xff0c;更能说明Kmeans的效果。 #!/usr/bin/python # -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as p…

一个电商项目的功能模块梳理

电商项目核心玩法&#xff1a;定制商品供应链&#xff08;商品辅料库&#xff09;网红社区最近做项目&#xff0c;功能越来越多&#xff0c;想清晰地理解项目&#xff0c;有点累了。今天抽空&#xff0c;把这个项目的核心功能模块简要总结下&#xff0c;顺便画了个图。一、全局…

java8 循环jsonarray_JSONArray 遍历方式

第一种(java8):遍历JSONArray 拼接字符串 public static void main(String[] args) {JSONArray jSONArray = new JSONArray(); JSONObject jb = new JSONObject(); jb.put("id", 1); jb.put("name", "s"); jSONArray.add(jb); JSONObject j1 = …

Codeforces Round #361(div 2)

A题题目意思很简单&#xff0c;问一种拨号的方式(拨号手势)是不是能拨出唯一的号码(例如253就不是唯一的&#xff0c;因为586也是可以的) 记录电话上每个格子上下左右是否还有格子&#xff0c;一个拨号手势是唯一的当且仅当&#xff0c;所拨号码的所有格子在同一个方向不同时有…

java货物进销管理系统_java实验 货物进销管理系统

实验二货物进销管理系统一&#xff0e;实验目的1&#xff0e;掌握Java中文件的读写操作。2&#xff0e;学会使用Java提供的实用类(Vector, ArrayList)来完成特定的功能。3&#xff0e;掌握字符串类(String, StringBuffer)的使用。4&#xff0e;掌握用面向对象的方法分析和解决复…

java forkjoin 简书_浅谈Java的Fork/Join并发框架

1. Fork/Join是什么Oracle的官方给出的定义是&#xff1a;Fork/Join框架是一个实现了ExecutorService接口的多线程处理器。它可以把一个大的任务划分为若干个小的任务并发执行&#xff0c;充分利用可用的资源&#xff0c;进而提高应用的执行效率。Fork/Join实现了ExecutorServi…

GCD API 理解 (一)

资料先行 GCD 深入理解&#xff1a;第一部分 GCD 深入理解&#xff1a;第二部分 以上两篇文章是关于GCD讲的比较好的文章&#xff0c;翻译自raywenderlich&#xff0c;该网站有很多关于iOS 开发的优秀文章。 引子 iOS 开发中有三大进阶性的技术点&#xff0c;分别是GCD、runti…

java怎么生成字母_在Java中生成字母序列

我的版本实现了Iterator并且保持一个int计数器.计数器值转换为相应的字符串&#xff1a;import com.google.common.collect.AbstractIterator;class Sequence extends AbstractIterator {private int now;private static char[] vs;static {vs new char[Z - A 1];for(char iA…

linux 的终端字体色和背景色的修改方法(二)

Linux终端下的颜色设置 2013-08-31 22:57:15分类&#xff1a; LINUX 在 ANSI 兼容终端&#xff08;例如 xterm、rxvt、konsole 等&#xff09;里&#xff0c; 可以用彩色显示文本而不仅仅是黑白。 本文示范了如何使用粗体和彩色的文字。 相信每一位Linux使用者都要面对 Bash。 …

java中的STL库_C++11 STL线程库实现一个简单的线程池

使用C11 STL线程库实现一个线程池。处理机制是抢占式的&#xff0c;即所有线程从一个队列(std::queue)中获取任务执行(计算字符串简单HASH值)&#xff0c;使用std::mutex和std::conditional_variable实现队列访问并发协调。#include #include #include #include #include #incl…

广搜 广搜 poj 3984

***求最短路径&#xff0c;然后再输出路径&#xff0c; BFS路径输出*** #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cmath>using namespace std…

pycharm新建python file没有默认头_Pycharm 设置默认头的图文教程

Pycharm 设置默认头的图文教程1. 设置的路径是File->settings->Editor->File and Code Templates->Python Script内容见图&#xff1a;这样新建文件的时候就会默认头如下&#xff1a;这里说明下#!/usr/bin/evn python 和 #!/usr/bin/python的区别&#xff1a;第一种…

python redis订阅_Python 学习笔记 - Redis

Redis 和Memcached类似 也是一个开源的内存存储系统&#xff0c;存储格式也是通过键值对的方式。不过和memcached比起来&#xff0c;memcached的value只支持字符串&#xff0c;而redis支持字符串&#xff0c;列表&#xff0c;集合&#xff0c;hash等等&#xff1b;这些数据类型…

egret中loadingUI的自定义

loadingUI中是加载资源&#xff0c;此时如果想自定义loadingUI界面&#xff0c;那么此刻正在加载的图片肯定不能用了。 解决方法就是使用服务器资源 直接加载服务器资源就好了 class LoadingUI extends egret.Sprite { public constructor(){ super(); this.c…

python不支持的数据类型有achar bint cfloat dlist_第1篇:Cython的数据类型(第二部分)

Cython的C指针与C一样&#xff0c;尽管指针性与变量而不是类型相关联&#xff0c;但可以在类型或变量附近声*号。%%cythoncdef int *acdef int *b但这样在变量a,b写在一行,cython编译器会发出警告的信息,因此建议每个变量单独声明%%cythoncdef int *a,*bCython中的指针的解引操…

java 调用dll 方法 postmessage实现后台模拟按键_VB实现模拟键盘及模拟鼠标(后台操作)...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼接下来来研究下模拟鼠标模拟鼠标的常数整理&#xff0c;如下&#xff1a;WM_MOUSEFIRST 0x0200 //移动鼠标时发生WM_MOUSEMOVE 0x0200 //移动鼠标时发生&#xff0c;同WM_MOUSEFIRSTWM_LBUTTONDOWN 0x0201 //按下鼠标左键WM_LBUTTO…

【micropython】用python来进行BadUSB的USB-HID测试(含无线控制)

转载请注明&#xff1a;小五义http://www.cnblogs.com/xiaowuyi QQ群&#xff1a;64770604 本文以TPYBoardv101开发板为例讲解了利用micropython进行BadUSB的usb-HID设备测试的主要方法&#xff0c;使用mt7681模块进行了一个简单的实验&#xff0c;实现了手机摇控键盘输入的测…

php返回类中方法,php如何获取类中所有的方法名

php获取类中所有的方法名的方法&#xff1a;可以利用【get_class_methods()】函数来获取&#xff0c;【get_class_methods()】函数可以返回指定类中所有的方法名&#xff0c;并且会将方法名保存到数组中。【相关学习推荐&#xff1a;php编程(视频)】php获取类所有方法名的方法&…