Создайте подходящую вам среду быстрой разработки — спецификация кодов бизнес-ошибок и практика

Spring Boot

предисловие

При написании бизнес-кода часто необходимо определить разные коды состояния для представления разных результатов выполнения. Общие основные методы в основном включают следующие два: во-первых, унифицированное тело возврата определяется в бизнес-методе, и внешнее унифицированное тело возврата обрабатывается глобально; во-вторых, в бизнес-методе выдается пользовательское исключение, а внешний уровень унифицированная обработка исключений. Здесь нет никакого сравнения между ними Заинтересованные студенты могут пойти узнать. Здесь в основном обсуждается второй метод, который также используется в этой среде быстрой разработки.

Определение и спецификация кода ошибки

Перечисление кодов ошибок

Только одного поля кода ошибки может быть недостаточно для описания кода ошибки, поэтому для описания кода ошибки обычно определяется отдельный класс перечисления. Вот определение:

Атрибуты тип инструкция
value int значение кода ошибки
name String Название кода ошибки или описание

Комментарий к коду ошибки

После того, как код ошибки определен, необходимо добавить пользовательское описание-аннотацию, удобное для сканирования и загрузки в память после старта системы и предоставления страницы рендеринга для просмотра.

Атрибуты тип инструкция
name String Название модуля - английский
value String Описание кода ошибки
bizCode int бизнес-код
min int минимум
max int максимальное значение

Спецификация кода ошибки

Разный бизнес, код ошибки разный, поэтому каждый бизнес обычно применяется заранее или определяет код ошибки. Здесь используется код ошибки, состоящий из 8 цифр. Например: 80000001, 99990401 и т.д. В целом рекомендуется, чтобы бизнес-класс соответствовал классу перечисления кодов ошибок. Тем не менее, если вам не нужно много судить, вы можете совместно использовать класс перечисления кодов ошибок в нескольких классах обслуживания в модуле.

Пример возвращаемого результата

успех

http status: 200

{
	"code": 0,
	"data": {
	},
	"msg": "操作成功"
}

Ошибка

http status: 200

{
  "code": 80009001,
  "msg": "用户不存在"
}

начать кодирование

Структура каталогов

Список только файлов, которые необходимо добавить или изменить

├── mldong-admin  管理端接口
    ├── emuns
    	src/main/java
      └──com.mldong.modules.sys
        └── controller 控制层
        	└── SysUserController.java
        ├── enums
        	└── SysErrEnum.java
        └── service 服务层
        	├── impl
        		└── SysUserServiceImpl
        	└── SysUserService.java
├── mldong-common  工具类及通用代码
	├── src/main/java
	  ├── com.mldong.common.base
	  	└── CommonError.java
	  ├── com.mldong.common.base.constant
	  	└── GlobalErrEnum.java
      ├── com.mldong.common.annotation
      	└── ErrEnum.java
      └──com.mldong.common.exception
        ├── BizException.java
     	└── DefaultExceptionHandler.java
	└── pom.xml
├── mldong-generator  代码生成器
└── mldong-mapper 持久层

описание файла

  • mldong-common/com/mldong/common/base/CommonError.java
package com.mldong.common.base;
/**
 * 错误码接口-所有的错误码都要实现该接口
 * @author mldong
 *
 */
public interface CommonError {
	int getValue();
    String getName();
}

  • mldong-common/com/mldong/annotation/ErrEnum.java
package com.mldong.common.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 错误码枚举注解,方便收集错误码描述,统一查看的
 * @author mldong
 *
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface ErrEnum {
	/**
	 * 名称
	 * @return
	 */
	String name();
	/**
	 * 说明
	 * @return
	 */
	String value();
	/**
	 * 业务码
	 * @return
	 */
	int bizCode();
	/**
	 * 最小值
	 * @return
	 */
	int min();
	/**
	 * 最大值
	 * @return
	 */
	int max();
}
  • mldong-common/com/mldong/common/annotation/GlobalErrEnum.java
package com.mldong.common.base.constant;

import com.mldong.common.annotation.ErrEnum;
import com.mldong.common.base.CommonError;
/**
 * 全局错误码
 * @author mldong
 *
 */
@ErrEnum(name="global",value="全局错误码",bizCode=9999,min=0,max=1000)
public enum GlobalErrEnum implements CommonError {
	/**
	 * 参数异常
	 */
	GL99990100(99990100, "参数异常"),
	/**
	 * 无访问权限
	 */
	GL99990401(99990401, "无访问权限"),
	/**
	 * 未知异常
	 */
	GL99990500(99990500, "未知异常"),
	/**
	 * 无权访问
	 */
	GL99990403(99990403, "无权访问"),
	/**
	 * 找不到指定资源
	 */
	GL99990404(99990404, "找不到指定资源"),
	/**
	 * 注解使用错误
	 */
	GL99990001(99990001, "注解使用错误"),
	/**
	 * 微服务不在线,或者网络超时
	 */
	GL99990002(99990002, "微服务不在线,或者网络超时"),
	/**
	 * 没有数据
	 */
	GL99990003(99990003, "没有数据"),
	/**
	 * 演示账号,无写权限
	 */
	GL99990004(99990004, "演示账号,无写权限"),
	/**
	 * 数据库插入异常
	 */
	GL99990005(99990005, "数据库插入异常"),
	/**
	 * 文件后辍不允许
	 */
	GL99990006(99990006, "文件后辍不允许"),
	;
	
	private GlobalErrEnum(int value, String name){
		this.value = value;
		this.name = name;
	} 
	private String name;

	private int value;

	public int getValue() {
		return value;
	}
	public String getName() {
		return name;
	}
}
  • mldong-common/com/mldong/common/exception/BizException.java
package com.mldong.common.exception;

import com.mldong.common.base.CommonError;
/**
 * 业务错码异常类
 * @author mldong
 *
 */
public class BizException extends RuntimeException{

	private static final long serialVersionUID = -8059304617449091328L;
	/**
	 * 错误
	 */
	private CommonError error;
	public BizException(CommonError error) {
		super("[" + error.getValue() + "]" + error.getName());
		this.error = error;
	}
	public CommonError getError() {
		return error;
	}
	public void setError(CommonError error) {
		this.error = error;
	}
}
  • mldong-common/com/mldong/common/exception/DefaultExceptionHandler.java

Новая обработка исключений BizException

package com.mldong.common.exception;

import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.mldong.common.base.CommonError;
import com.mldong.common.base.CommonResult;
 /**
  * 全局异常处理类
  * @author mldong
  *
  */
@ControllerAdvice
public class DefaultExceptionHandler {
 
    private static Logger log = LoggerFactory.getLogger(DefaultExceptionHandler.class);  
    /**
     * 服务层异常
     * @param e
     * @return
     */
    @ExceptionHandler(BizException.class)
    @ResponseBody
    public CommonResult<CommonError> serviceExceptionHandler(BizException e) {
    	log.error("服务层异常:", e);
    	return CommonResult.fail(e.getError());
    }

    /**
     * 控制层参数校验异常
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class) 
    @ResponseBody
    public CommonResult<?> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
    	log.error("参数校验异常:{}", e.getMessage());
    	;
    	String errorMsg = String.join(",", e.getBindingResult().getAllErrors().stream().map(item->{
    		return item.getDefaultMessage();
    	}).collect(Collectors.toList()));
    	return CommonResult.fail(errorMsg, e.getBindingResult());
    }
    /**
     * 其他异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class) 
    @ResponseBody
    public CommonResult<?> excetionHandler(Exception e){
    	log.error("未捕获异常:", e);
    	return CommonResult.fail(e.getMessage(), null);
    }
}

  • mldong-admin/com/mldong/modules/sys/emuns/SysErrEnum.java
package com.mldong.modules.sys.enums;

import com.mldong.common.annotation.ErrEnum;
import com.mldong.common.base.CommonError;
/**
 * 8000 9001-9999
 * sys模块错误码定义
 * @author mldong
 *
 */
@ErrEnum(name="sys",value="系统管理",bizCode=8000,min=9001,max=9999)
public enum SysErrEnum implements CommonError {
	/**
	 * 用户不存在
	 */
	SYS80000001(80009001, "用户不存在"),
	/**
	 * 用户名或者密码错误
	 */
	SYS80000002(80009002, "用户名或者密码错误"),
	/**
	 * 登录次数太多
	 */
	SYS80000003(80009003, "登录次数太多"),
	/**
	 * 用户已被锁定
	 */
	SYS80000004(80009004, "用户已被锁定"),
	/**
	 * 两密码不一致
	 */
	SYS80000005(80009005,"两密码不一致"),
	/**
	 * 旧密码错误
	 */
	SYS80000006(80009006,"旧密码错误"),
	/**
	 * 用户名已存在
	 */
	SYS80000007(80009007, "用户名已存在")
	;
	public final int value;
	public final String name;
	SysErrEnum(int value,String name) {
		this.value = value;
		this.name = name;
	}
	@Override
	public int getValue() {
		return this.value;
	}
	@Override
	public String getName() {
		return this.name;
	}
}
  • mldong-admin/com/mldong/modules/sys/service/impl/SysUserServiceImpl.java

Пример использования бизнес-уровня

package com.mldong.modules.sys.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.mldong.common.base.CommonPage;
import com.mldong.common.exception.BizException;
import com.mldong.modules.sys.entity.SysUser;
import com.mldong.modules.sys.enums.SysErrEnum;
import com.mldong.modules.sys.mapper.SysUserMapper;
import com.mldong.modules.sys.service.SysUserService;
@Service
public class SysUserServiceImpl implements SysUserService{
	@Autowired
	private SysUserMapper sysUserMapper;
	@Override
	public int save(SysUser param) {
		SysUser q = new SysUser();
		q.setUserName(param.getUserName());
		SysUser user = sysUserMapper.selectOne(q);
		if(null!=user) {
			// 用户已存在
			throw new BizException(SysErrEnum.SYS80000007);
		}
		return sysUserMapper.insertSelective(param);
	}
	@Override
	public int update(SysUser param) {
		return sysUserMapper.updateByPrimaryKeySelective(param);
	}

	@Override
	public int delete(Long id) {
		return sysUserMapper.deleteByPrimaryKey(id);
	}

	@Override
	public SysUser get(Long id) {
		return sysUserMapper.selectByPrimaryKey(id);
	}

	@Override
	public CommonPage<SysUser> list(SysUser t, int pageNum, int pageSize) {
		Page<SysUser> page = PageHelper.startPage(pageNum, pageSize,true);
		sysUserMapper.select(t);
		return CommonPage.toPage(page);
	}
}

Запустить работающий проект

MldongAdminApplication.java

Щелкните правой кнопкой мыши -> Запустить от имени -> Приложение Java.

посетить демо

немного

Адрес исходного кода проекта

  • задняя часть

git ee.com/красивое желе/красивое о…

  • внешний интерфейс

git ee.com/красивое желе/красивое о…

Статьи по Теме

Создайте фреймворк быстрой разработки, который вам подходит - пилот

Создайте фреймворк для быстрой разработки, который подходит именно вам — back-end scaffolding

Создайте фреймворк для быстрой разработки, который вам подходит - встроенный картограф

Создайте подходящий для себя фреймворк для быстрой разработки, интегрировав swaggerui и knife4j

Создайте подходящую для вас среду быстрой разработки - унифицированный возврат результатов и унифицированная обработка исключений общей инкапсуляции классов