快速生成通用接口业务配置

这篇具有很好参考价值的文章主要介绍了快速生成通用接口业务配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个是干什么的?

简单介绍下:

作用:通过插件一键生成某个表对应的增删改查等基础或者说通用接口,这里面的代码是基础版的,后续改良后,很多业务的通用功能,比如流程的启动,自动下一步,通用导出,通用导入等等。

原理:核心就是BasicControllerPostProcessor ,通过动态生成代理对象,完成逻辑实现。这里呢经过实践呢后续也有不少优化的,后续我总结后发一个新版的

一、核心处理类

package com.nari.core.handler;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Map;


/**
* 动态加载baseMapper,baseDao,baseService
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永胜</a>
* @version 1.0.0
* @since 2021/3/2
*/

@Slf4j
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class BasicControllerPostProcessor extends CommonAnnotationBeanPostProcessor {

private static final long serialVersionUID = -945664767382485314L;

@SuppressWarnings("NullableProblems")
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
String packageName = beanClass.getPackage().getName();
log.trace("beanName---{},packageName:{}", beanName, packageName);
List<String> per = ListUtil.of("com.nari.supervision.daily");
List<String> tail = ListUtil.of("outbound","personal");
if (per.stream().anyMatch(packageName::contains)) {
if (tail.stream().map(v -> v + ".controller").anyMatch(packageName::contains)) {
try {
updateResourceName(beanClass, beanName, "basicService", "Controller", "Service");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
if (tail.stream().map(v -> v + ".service").anyMatch(packageName::contains)) {
try {
updateResourceName(beanClass, beanName, "basicMapper", "Service", "TransformImpl");
updateResourceName(beanClass, beanName, "basicDao", "Service", "Mapper");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
if (tail.stream().map(v -> v + "serviceImpl").anyMatch(packageName::contains)) {
try {
updateResourceName(beanClass, beanName, "basicMapper", "Service", "TransformImpl");
updateResourceName(beanClass, beanName, "basicDao", "Service", "Mapper");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
return null;
}

private void updateResourceName(Class<?> beanClass, String beanName, String destField, String searchString, String replaceString)
throws NoSuchFieldException, IllegalAccessException
{
Field field = beanClass.getSuperclass().getDeclaredField(destField);
Resource basicMapper = field.getAnnotation(Resource.class);
InvocationHandler invocationHandler = Proxy.getInvocationHandler(basicMapper);
Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
memberValues.setAccessible(true);
//noinspection unchecked
Map<String, Object> map = (Map<String, Object>) memberValues.get(invocationHandler);
map.put("name", StringUtils.replace(beanName, searchString, replaceString));
}
}

二、基础类

BasicController

package com.nari.core.basic;

import com.nari.core.annotation.OperationLog;
import com.nari.core.groups.basic.InsertGroup;
import com.nari.core.groups.basic.UpdateGroup;
import com.nari.core.groups.query.PageQueryGroup;
import com.nari.core.web.ApiResult;
import com.nari.core.web.BaseParam;
import com.nari.core.web.PageResult;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiSort;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;


/**
* 基础接口管理
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永胜</a>
* @version 1.0.0
* @since 2021/3/1
*/

@Slf4j
@Valid
public class BasicController<T extends BasicModel, Q extends BaseParam, V, D, M extends BasicMapper<T, Q, D, V>> extends com.nari.core.web.BaseController {

@Resource
private BasicService<T, Q, V, D, M> basicService;

/**
* 添加
*
* @param query {@link Q}
*/

@PostMapping
@ApiOperation(value = "1.1 添加")
@OperationLog(value = "添加")
@Validated(value = InsertGroup.class)
public ApiResult insert(@RequestBody Q query)
{
basicService.insert(query);
return success("添加成功!");
}


/**
* 根据id删除
*
* @param id 主键
*/

@DeleteMapping("/{id}")
@ApiOperation(value = "1.2 根据id删除")
@OperationLog(value = "根据id删除")
public ApiResult del(@PathVariable("id") String id) {
basicService.del(id);
return success("删除成功!");
}

/**
* 根据id删除-软删除,实际修改标识符
*
* @param id 主键
*/

@DeleteMapping("/{id}/weak")
@ApiOperation(value = "1.3 根据id删除-软删除,实际修改标识符")
@OperationLog(value = "根据id删除-软删除,实际修改标识符")
public ApiResult delWeak(@PathVariable("id") String id) {
basicService.delWeak(id);
return success("删除成功!");
}


/**
* 根据id更新信息
*
* @param query {@link Q}
*/

@PutMapping("update")
@ApiOperation(value = "1.4 根据id更新信息")
@OperationLog(value = "根据id更新信息")
@Validated(value = UpdateGroup.class)
public ApiResult<V> update(@RequestBody Q query)
{
return success(basicService.update(query));
}

/**
* 根据id更新信息-批量
*
* @param query {@link Q}
*/

@PutMapping("updateBatch")
@ApiOperation(value = "1.5 根据id更新信息-批量")
@OperationLog(value = "根据id更新信息-批量")
@Validated(value = UpdateGroup.class)
public ApiResult updateBatch(@RequestBody List<Q> query)
{
basicService.updateBatch(query);
return success();
}


/**
* 查询单个数据
*
* @param id 主键
*/

@GetMapping("/{id}")
@ApiOperation(value = "1.6 查询单个数据")
@OperationLog(value = "查询单个数据")
public ApiResult<V> select(@PathVariable("id") String id) {
return success(basicService.select(id));
}

/**
* 分页
*
* @param query {@link Q}
*/

@GetMapping("page")
@ApiOperation(value = "1.7 分页")
@OperationLog(value = "分页")
@Validated(value = PageQueryGroup.class)
public ApiResult<PageResult<V>> listUser(Q query)
{
return success(basicService.page(query));
}
}

BasicDao

package com.nari.core.basic;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nari.core.web.BaseParam;
import com.nari.core.web.PageParam;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
* 基础接口
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永胜</a>
* @version 1.0.0
* @since 2021/3/1
*/

public interface BasicDao<T extends BasicModel, D, Q extends BaseParam> extends BaseMapper<T> {
List<D> selectPageRel(@Param("page") PageParam<D, Q> page, @Param("param") Q param);
}

BasicEnum

package com.nari.core.basic;


/**
* 基础枚举
* 主要用来配合apijson实现枚举展示
*
* @author <a href="mailto:17602556550@189.cn">朱永胜</a>
* @version 1.0.0
* @since 2023/5/25
*/

public interface BasicEnum {
String getName();

Integer getValue();
}

BasicMapper

package com.nari.core.basic;

import org.mapstruct.MappingTarget;

import java.util.List;


/**
* 基础转换
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永胜</a>
* @version 1.0.0
* @since 2021/3/1
*/

public interface BasicMapper<T, Q, D, V> {
T query2do(Q query);

V dto2View(D dto);

D do2dto(T role);

void update(Q query, @MappingTarget T t);

List<V> dto2ViewPage(List<D> dto);
}

BasicModel

package com.nari.core.basic;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
* 通用模型
*
* @author <a href="mailto:17602556550@189.cn">朱永胜</a>
* @version 1.0.0
* @since 2023/5/26
*/

@Data
public class BasicModel {
/**
* 主键
*/

private String id;

/**
* 删除标识
*/

@ApiModelProperty(value = "删除标识")
private String deleted;
}

BasicService

package com.nari.core.basic;

import cn.hutool.core.util.IdUtil;
import com.nari.core.web.BaseParam;
import com.nari.core.web.PageParam;
import com.nari.core.web.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;


/**
* 基础服务
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永胜</a>
* @version 1.0.0
* @since 2021/3/1
*/

@Slf4j
public class BasicService<T extends BasicModel, Q extends BaseParam, V, D, M extends BasicMapper<T, Q, D, V>> {
@Resource
private BasicDao<T, D, Q> basicDao;

@Resource
private BasicMapper<T, Q, D, V> basicMapper;

/**
* 添加
*
* @param query {@link Q}
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永胜</a >
* @since 2021/3/1
* @since 1.0.0
*/

@Transactional(rollbackFor = Exception.class)
public void insert(@Valid Q query)
{
T t = basicMapper.query2do(query);
t.setId(IdUtil.simpleUUID());
basicDao.insert(t);
}

/**
* 删除
*
* @param id {@link Q}
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永胜</a >
* @since 2021/3/1
* @since 1.0.0
*/

@Transactional(rollbackFor = Exception.class)
public void del(@NotNull String id)
{
basicDao.deleteById(id);
}

/**
* 根据用户id更新
*
* @param query @{@link Q}
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永胜</a >
* @since 2021/3/1
* @since 1.0.0
*/

@Transactional(rollbackFor = Exception.class)
public V update(@Valid Q query)
{
T data = basicMapper.query2do(query);
basicDao.updateById(data);
D d = basicMapper.do2dto(data);
return basicMapper.dto2View(d);
}

/**
* 查询
*
* @param id 主键
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永胜</a >
* @since 2021/3/1
* @since 1.0.0
*/

public V select(@NotNull String id) {
T data = basicDao.selectById(id);
D d = basicMapper.do2dto(data);
return basicMapper.dto2View(d);
}


/**
* 查询多条记录
*
* @param query {@link Q}
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永胜</a >
* @since 2021/2/23
* @since 1.0.0
*/

public PageResult<V> page(@Valid Q query) {
PageParam<D, Q> page = new PageParam<>(query);
page.setDefaultOrder("create_time desc");
List<D> list = basicDao.selectPageRel(page, query);

List<V> vList = basicMapper.dto2ViewPage(list);
log.trace("{}", list);

return new PageResult<>(vList, page.getTotal());
}

/**
* 软删除
*
* @author <a href="mailto:17602556550@189.cn">朱永胜</a>
* @since 2023/5/26
*/

@Transactional(rollbackFor = Exception.class)
public void delWeak(String id)
{
T t = basicDao.selectById(id);
t.setDeleted("1");
basicDao.updateById(t);
}

/**
* 批量更新
*
* @author <a href="mailto:17602556550@189.cn">朱永胜</a>
* @since 2023/6/6
*/

@Transactional(rollbackFor = Exception.class)
public void updateBatch(List<Q> query)
{
query.forEach(this::update);
}
}

GenericSuperclassUtil

package com.nari.core.basic;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericSuperclassUtil {

/*
* 获取泛型类Class对象,不是泛型类则返回null
*/

public static Class<?> getActualTypeArgument(Class<?> clazz) {
Class<?> entitiClass = null;
Type genericSuperclass = clazz.getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass)
.getActualTypeArguments();
if (actualTypeArguments != null && actualTypeArguments.length > 0) {
entitiClass = (Class<?>) actualTypeArguments[0];
}
}

return entitiClass;
}

/*
* 获取泛型类Class对象,不是泛型类则返回null
*/

static Class<?> getActualTypeArgument(Class<?> clazz, Integer pos) {
Class<?> entitiClass = null;
Type genericSuperclass = clazz.getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass)
.getActualTypeArguments();
if (actualTypeArguments != null && actualTypeArguments.length > pos) {
entitiClass = (Class<?>) actualTypeArguments[pos];
}
}

return entitiClass;
}
}

三、POM

  <org.mapstruct.version>1.5.5.Final</org.mapstruct.version>

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>

</configuration>
</plugin>

本文由 mdnice 多平台发布文章来源地址https://www.toymoban.com/news/detail-648458.html

到了这里,关于快速生成通用接口业务配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通用操作接口UMI:如何快速简单地给机器人提供更多学习数据?

    论文标题: Universal Manipulation Interface: In-The-Wild Robot Teaching Without In-The-Wild Robots 论文作者: Cheng Chi , Zhenjia Xu , Chuer Pan, Eric Cousineau, Benjamin Burchfiel, Siyuan Feng, Russ Tedrake, Shuran Song 项目地址: https://umi-gripper.github.io/ 导读: 斯坦福团队提出通用操纵接口(UMI)通用框架,可以直接

    2024年04月12日
    浏览(36)
  • XXX汽车SAP ERP系统接口提速,助力生产物流业务数据快速处理(投稿数字化月报一)

            XXX汽车每台整车的生产订单数据(含配置BOM)都通过整车订单下达接口下发,因为数据量庞大且又和生产、物流、质量等业务域息息相关,一直是ERP项目组重点关注的接口。从2019年项目初发给MOM生产、LES物流系统到现在,下游接收系统已经增加到15个之多。针对该

    2024年02月12日
    浏览(49)
  • 微信小程序自研业务接口的服务器一点配置记录整理

    微信小程序的开发和APP的开发有些类似,但又略有不同。 App一般有很多版本,甚至要兼容很多版本兼容,尤其是各个小版本之间一般都是要共存的。当然如果有较大变化或者升级,尤其是底层逻辑或者数据库结构改动,一般会强制升级。 因为要多个版本兼容,互相不影响使

    2023年04月25日
    浏览(40)
  • 如何给网站或者后端服务免费且快速的进行配置HTTPS,配置ssl证书

    现在部署的网站用的大多都是 https 协议的,还有的平台你要是想发布自己的网站就必须得是 https 的协议,如果不使用 ssl 的话,那就不让你使用.就比如微信,支付宝等的产品,不用的话就不让你使用他们的平台.不过还好很多服务厂商都提供了免费 ssl 证书可以进行配置 今天的情况

    2024年02月09日
    浏览(42)
  • H5套壳微信小程序跳转H5以及配置服务器接口域名和业务域名

    一、H5套壳微信小程序跳转H5 基本语法: web-view src=\\\"https://你的域名\\\"/web-view 1. 其中,url必须在管理后台加进业务域名,并且是https开头的。 使用了web-view,页面将不能放置其他元素,因为web-view会铺满整个页面 电脑端调试,需要在开发者工具的项目设置里把基础库版本改为最

    2024年02月07日
    浏览(46)
  • IntelliJ IDEA 中使用Apifox IDEA 插件快速生成接口API (Java 开发告别写接口文档)

    Apifox IDEA 插件快速上手 | Apifox 帮助文档 特别注意: 1、idea版本必须大于2019.03才可以使用这个插件 2、修改设置不然分组校验必填项,apifox里面显示都是必填 添加图片注释,不超过 140 字(可选) Apifox IDEA 插件(Apifox Helper) 主要用于 IDEA 项目快速生成 API 文档,并同步到 A

    2024年03月24日
    浏览(66)
  • IDEA好用插件:MybatisX快速生成接口实体类mapper.xml映射文件

    目录  1、在Idea中找到下载插件,Install,重启Idea  2、一个测试java文件,里面有com包  3、在Idea中添加数据库 --------以Oracle数据库为例  4、快速生成entity-service-mapper方法  5、查看生成的代码  6、自动生成(增删查改)在TestMapper中快速编写代码 1、在Idea中找到下载插件,Ins

    2024年02月02日
    浏览(59)
  • 复杂业务系统的通用架构设计法则

    我们经常提到复杂系统,那么到底什么是复杂系统。我们看下维基的定义:复杂系统(英语:complex system),又称复合系统,是指由许多可能相互作用的组成成分所组成的系统。强调了两点: 由点组成 点之间有各种关联 两点的规模和复杂性直接决定了系统的复杂程度。比如

    2024年02月08日
    浏览(54)
  • 华为eNSP配置RSTP(快速生成树)

    LSW1 LSW2 LSW3

    2024年02月07日
    浏览(41)
  • 【架构实践】复杂业务系统的通用架构设计法则

    目录 一、什么是复杂系统 二、什么是架构 三、架构的本质 四、架构分类

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包