一个简单的外部系统调用接口日志记录demo

2023-11-16

一、实现思想

抽取接口共方法,作为抽象类。然后不同业务实现类继承此抽象类,实现具体业务。

分析可知公共部分就是将外系统入参接口返回参数记录到数据库,将其抽取出来,作为基础抽象类的公共方法,业务类继承此抽象类,使得不用在每一个业务实现类里面重复造轮子。

二、代码

1、基础抽象类代码demo

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xpf.BrandEnum;
import com.xpf.entity.InputAPILog;
import com.xpf.entity.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component
public abstract class AbstractIntoLogImpl<P, R> {

    public R intoLog(P p){
        //拿到入参
        InputAPILog inputAPILog = new InputAPILog();
        inputAPILog.setCreateTime(new Date());
        inputAPILog.setVersion(1);
        inputAPILog.setInputParams(JSON.toJSONString(p));
        inputAPILog.setBarnd(getBrand().getBrandName());
        R r = null;
        try{
            //执行业务
            r = doAction(p);
            inputAPILog.setOutParams(JSON.toJSONString(r));
            System.out.println(inputAPILog);
        }catch (Exception e){
            inputAPILog.setVersion(0);
            inputAPILog.setUpdateTime(new Date());
            log.error("执行API出错:{}", e.getMessage());
            //记得把错误继抛出
            throw e;
        }
        return r;
    }

    public abstract BrandEnum getBrand();

    //执行真正的业务
    public abstract R doAction(P p);
}

2、继承此基础抽象类的业务实现类demo

import com.alibaba.fastjson.JSONObject;
import com.xpf.BrandEnum;
import com.xpf.entity.ResultVO;
import org.springframework.stereotype.Service;

@Service
public class BMWapiServiceImpl extends AbstractIntoLogImpl<JSONObject, ResultVO> {
    @Override
    public BrandEnum getBrand() {
        return BrandEnum.BMW;
    }

    @Override
    public ResultVO doAction(JSONObject jsonObject) {
        String bmw = (String) jsonObject.get("BMW");
        return ResultVO.success(bmw);
    }
}

3、写一个controller调用此业务类

import com.alibaba.fastjson.JSONObject;
import com.xpf.entity.ResultVO;
import com.xpf.service.impl.AMGapiServiceImpl;
import com.xpf.service.impl.BMWapiServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/API")
public class TestController {

    @Autowired
    private BMWapiServiceImpl bmWapiService;

    @Autowired
    private AMGapiServiceImpl amGapiService;

    @PostMapping("/getBMW")
    public ResultVO getBMW(@RequestBody JSONObject jsonObject){
        return bmWapiService.intoLog(jsonObject);
    }

    @PostMapping("/getAMG")
    public ResultVO getAMG(@RequestBody JSONObject jsonObject){
        return amGapiService.intoLog(jsonObject);
    }

}

(另一个AMG业务实现类也类似,写出来比较比较)

import com.alibaba.fastjson.JSONObject;
import com.xpf.BrandEnum;
import com.xpf.entity.ResultVO;
import org.springframework.stereotype.Service;

@Service
public class AMGapiServiceImpl extends AbstractIntoLogImpl<JSONObject, ResultVO>{
    @Override
    public BrandEnum getBrand() {
        return BrandEnum.AMG;
    }

    @Override
    public ResultVO doAction(JSONObject jsonObject) {
        return ResultVO.success(jsonObject.get("AMG"));
    }
}

对,顺带把 ResultVO 统一返回类粘出如下

import java.io.Serializable;

public class ResultVO implements Serializable {
    private static final long serialVersionUID = -545712146633028245L;
    private boolean success;
    private String code;
    private String message;
    private Object data;

    public String getCode() {
        return this.code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMessage() {
        return this.message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return this.data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public boolean isSuccess() {
        return this.success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public ResultVO() {
        this.success = false;
    }

    public ResultVO(boolean success) {
        this.success = success;
    }

    public ResultVO(boolean success, Object data) {
        this.success = success;
        this.data = data;
    }

    public ResultVO(boolean success, String message, Object data) {
        this.success = success;
        this.message = message;
        this.data = data;
    }

    public static ResultVO success() {
        ResultVO resultVO = new ResultVO();
        resultVO.setSuccess(true);
        resultVO.setCode("200");
        resultVO.setMessage("");
        resultVO.setData((Object)null);
        return resultVO;
    }

    public static ResultVO success(String errorCode, String errMsg) {
        ResultVO resultVO = new ResultVO();
        resultVO.setSuccess(true);
        resultVO.setCode(errorCode);
        resultVO.setMessage(errMsg);
        resultVO.setData((Object)null);
        return resultVO;
    }

    public static ResultVO success(Object data) {
        ResultVO resultVO = new ResultVO();
        resultVO.setSuccess(true);
        resultVO.setCode("200");
        resultVO.setMessage("");
        resultVO.setData(data);
        return resultVO;
    }

    public static ResultVO serverErr(String errMsg) {
        ResultVO resultVO = new ResultVO();
        resultVO.setSuccess(false);
        resultVO.setCode("500");
        resultVO.setMessage(errMsg);
        resultVO.setData((Object)null);
        return resultVO;
    }

    public static ResultVO serverErr(String errorCode, String errMsg) {
        ResultVO resultVO = new ResultVO();
        resultVO.setSuccess(false);
        resultVO.setCode(errorCode);
        resultVO.setMessage(errMsg);
        resultVO.setData((Object)null);
        return resultVO;
    }
}

三、一个简单的外部系统调用接口日志记录就做好了,开测

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个简单的外部系统调用接口日志记录demo 的相关文章

随机推荐

  • 【RabbitMQ教程】springboot整合rabbitmq(topic模式)

    下面还是模拟注册服务当用户注册成功后 向短信和邮件服务推送消息的场景 搭建SpringBoot环境 创建两个工程 mq rabbitmq producer和mq rabbitmq consumer 分别配置1 2 3 第三步本例消费者用注解
  • 如何利用FPGA生成SPWM调制信号

    如何利用FPGA生成SPWM调制信号 实验目标 稍微说一下原理 SPWM即正弦波宽度脉冲调制 冲量等效原理 双极性的的SPWM信号 具体步骤 1 用matlab生成三角波和正弦波的coe文件 2 调用ROM的ip读取coe文件 3 调用pl
  • IDEA使用小技巧

    一 添加javadoc注释 在方法声明前面输入 再按回车 就会自动生成 二 自动生成setter和getter方法 首先创建出你的实体类 或者准备好你要生成getter和setter方法的属性 然后再空白处点击右键 会出现这个界面 然后点G
  • 克鲁斯卡尔算法小结(使用查并集)

    克鲁斯卡尔算法 最小生成树 1 基本思想 先构造一个只含 n 个顶点 而边集为空的子图 把子图中各个顶点看成各棵树上的根结点 之后 从网的边集 E 中选取一条权值最小的边 若该条边的两个顶点分属不同的树 则将其加入子图 即把两棵树合成一棵树
  • Python脚本的简单编写(if语句,逻辑运算符,for循环,游戏的编写)

    1 利用python求平均成绩 gt gt gt gt gt gt gt gt 题目要求 输入学生姓名 依次输入学生的三门科目成绩 计算该学生的平均成绩 并打印 平均成绩保留一位小数 计算该学生语文成绩占总成绩的百分比 并打印 gt gt
  • 解决CHM文件打开无法显示网页的问题

    解决CHM文件打开无法显示网页的问题 chm的设计者的初衷是用来做帮助文档 其本质是一堆html网页文件的组合 后来有了专门的编 译器 反编译器 人们发现chm这东西具有的html的特性 使其用来做电子书实在是又好又方便 连html里面的脚
  • 使用config-overrides.js修改react项目的大包路径的正确方式

    create react app创建之后 默认的打包路径为build文件夹 如果想要更改 不使用yarn eject暴露配置项的琴况下 可以使用config overrides js修改打包的路径 代码如下 const path requi
  • C/C++配置使用windows msys2中的gcc/g++编译器

    介绍 比较常见的 可以在Windows上安装各种工具链来编译C和C 应用程序 如果是专门为Windows开发的 那是推荐Microsoft 免费提供的Visual Studio Community 出色的IDE工具 对于那些需要或喜欢跨平台
  • LeetCode 45 跳跃游戏 II(Java)

    题目 给你一个非负整数数组 nums 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的最大长度 你的目标是使用最少的跳跃次数到达数组的最后一个位置 假设你总是可以到达数组的最后一个位置 示例1 输入 nums 2 3 1
  • 前端 华为OBS 上传图片和查看图片

    前提是OBS 使用的是SDK BrowserJS 下载SDK BrowserJS 1 前提 npm config set registry https registry npmjs org 2 esdk obs browserjs 3 20
  • 【转】Visual Studio 2010下配置PC-Lint 9.0i

    转自 http blog csdn net jbcjay article details 7389543 首先下载PC Lint安装包 可以到CSDN资源区搜索下载 或者直接到我上传的资源区下载 一 安装过程 下载完安装包后可以直接点击pc
  • 仅需四步,整合SpringSecurity+JWT实现登录认证 !

    学习过我的mall项目的应该知道 mall admin模块是使用SpringSecurity JWT来实现登录认证的 而mall portal模块是使用的SpringSecurity基于Session的默认机制来实现登陆认证的 很多小伙伴都
  • Redis( stringRedisTemplate)添加缓存数据

    在redis中添加缓存数据大致思路 1 从redis中获取数据 如果存在 直接返回客户端 2 不存在 查询数据库 并写入redis缓存 3 如果从数据库查询为空 返回错误信息 4 写入redis缓存并返回数据 通过String类型添加商品数
  • Java如何用JDBC操作数据库(新手入门级)

    引入相关依赖包 想要用JDBC操作数据库 我们就必须要下载JDBC相关的依赖 这些依赖其实就是我们用来操作数据库的代码 那么什么是JDBC呢 JDBC就是 Java DataBase Connectivity 的简称 是数据库连接的意思 J
  • MapXtreme 2005 for .Net系列------MapControl初尝

    这一段时间在闲暇时看看mapXtreme 2005 for net 自己觉得与AE庞大复杂的结构相比 mapXtreme 可谓简单点 由于规模比较小 所以理解起来比较简单 本来先发一篇综述的帖子 不过由于条件的限制 自己现将这篇帖子发出来
  • 独家

    翻译 张媛 校对 卢苗苗 本文共8269字 建议阅读10分钟 用代码将你的数据集进行多维可视化 介绍 描述性分析是与数据科学或特定研究相关的任何分析生命周期中的核心组成部分之一 数据聚合 汇总与可视化是支撑数据分析这一领域的主要支柱
  • 通过css设置filter 属性,使整个页面呈现灰度效果,让整个网页变灰

    通过css设置filter 属性设置页面整体置灰 效果图 通过设置 filter 属性为 grayscale 100 页面中的所有元素都会被应用灰色滤镜效果 使整个页面呈现灰度效果 filter 属性是用来给元素添加不同的滤镜 graysc
  • Qt自定义界面类并提升(提升的窗口部件),把OpenGL绘制的图形显示在QT的ui界面上

    编译环境 Qt Creator 5 4 0 mingw 最近利用QT做一个上位机界面 想用OpenGL将STL文件还原成三维模型 并将模型显示出来 那么问题来了 最简单的显示就直接创建一个窗口显示模型 根本就 没有用到QT的ui界面 现在的
  • JAVA区块链实战教程-杨长江-专题视频课程

    JAVA区块链实战教程 256人已学习 课程介绍 国内第一套以java语言讲解区块链原理的教程 包含实际项目和代码 让java从业人员 快速了解区块链和区块链原理 课程收益 1 区块链理论 以node js例子区块链原理有深刻理解 2 区块
  • 一个简单的外部系统调用接口日志记录demo

    一 实现思想 抽取接口共方法 作为抽象类 然后不同业务实现类继承此抽象类 实现具体业务 分析可知公共部分就是将外系统入参和接口返回参数记录到数据库 将其抽取出来 作为基础抽象类的公共方法 业务类继承此抽象类 使得不用在每一个业务实现类里面重