Java 日常开发记录

news2024/11/28 17:59:04

手动分页

非mybatis 自动分页

service 层

 @Override
    public PageInfo<CfLogVo> cfLogList(CfLogQuery cfLogQuery) {

        if (StrUtil.isNotBlank(cfLogQuery.getRequest()) && cfLogQuery.getRequest().length() >100){
            throw new ServiceException("请求报文长度不能大于100个字符!");
        };
        if (StrUtil.isNotBlank(cfLogQuery.getResponse()) && cfLogQuery.getResponse().length() >100){
            throw new ServiceException("响应报文长度不能大于100个字符!");
        };
        if (ObjectUtil.isEmpty(cfLogQuery.getBeginTime()))
            throw new ServiceException("开始时间不能为空!");
        if (ObjectUtil.isEmpty(cfLogQuery.getEndTime()))
            throw new ServiceException("结束时间不能为空!");


        //PageHelper.startPage(cfLogQuery.getPage(), cfLogQuery.getLimit());
        cfLogQuery.setPage((cfLogQuery.getPage() - 1) * cfLogQuery.getLimit());
        //Integer listLogsByCount = cfLogDao.findListLogsByCount(cfLogQuery);
        Integer listLogsByCount = 1000;
        List<CfLogVo> listLogs = cfLogDao.findListLogs(cfLogQuery);
        PageInfo pageInfo = new PageInfo<CfLogVo>(listLogs);
        pageInfo.setPageNum(cfLogQuery.getPage());
        pageInfo.setPageSize(cfLogQuery.getLimit());
        pageInfo.setTotal(listLogsByCount == null ? 0 : listLogsByCount);
        return pageInfo;
    }

maper

<select id="findListLogs" resultType="com.kamowl.kamo.cloud.third.open.vo.CfLogVo" parameterType="com.kamowl.kamo.cloud.third.open.query.report.cf.CfLogQuery">
        SELECT * from cf_log
        <include refid="where"/>
        order by create_time desc
        limit ${page},${limit}
    </select>

    <select id="findListLogsByCount"  resultType="integer"  parameterType="com.kamowl.kamo.cloud.third.open.query.report.cf.CfLogQuery">
        SELECT count(1) from cf_log
        <include refid="where"/>
    </select>

    <sql id="where">

        <where>
            <if test="type != null and type != ''">
                and type = #{type}
            </if>
            <if test="response != null and response != ''">
                and response like concat('%', #{response}, '%')
            </if>
            <if test="request != null and request != ''">
                and request like concat('%', #{request}, '%')
            </if>
            <if test="url != null and url != ''">
                and url like concat('%', #{url}, '%')
            </if>
            <if test="state != null ">
                and state = #{state}
            </if>
            <if test="beginTime != null">
                and create_time>=#{beginTime}
            </if>
            <if test="endTime != null">
                and #{endTime}>=create_time
            </if>



        </where>
    </sql>

事务@Transactional(rollbackFor=Exception.class)

当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。

在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚

属性类型描述
valueString可选的限定描述符,指定使用的事务管理器
propagationenum: Propagation可选的事务传播行为设置
isolationenum: Isolation可选的事务隔离级别设置
readOnlyboolean读写或只读事务,默认读写
timeoutint (in seconds granularity)事务超时时间设置
rollbackForClass对象数组,必须继承自Throwable导致事务回滚的异常类数组
rollbackForClassName类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
noRollbackForClass对象数组,必须继承自Throwable不会导致事务回滚的异常类数组
noRollbackForClassName类名数组,必须继承自Throwable不会导致事务回滚的异常类名字数组

注释权限@PreAuthorize

Spring-Security@PreAuthorize(“hasAuthority(‘’)”)源码分析
连接

Spring-Security@PreAuthorize(“hasAuthority(’’)”)源码分析

@PreAuthorize(“hasAuthority(‘xxx’)”)用来鉴别当前登录用户所拥有的角色是否有xxx权限访问该接口。
点进去看看security是如何来鉴权的。

这里authority即为我们传入的权限,比如prod:create,接下来再看this.hasAnyAuthority如何处理这个权限字符串吧。

翻看源码的话会发现其实hasAnyAuthority方法就在hasAuthority方法的下面,该访问hasAnyAuthorityName了,我们传入的权限字符串(prod:create)就像皮球一样被踢到了hasAnyAuthorityName脚下了~

该方法终于要射门了!
首行为 Set roleSet = this.getAuthoritySet(); 点进去getAuthorityeSet()方法看到

该方法为获取当前用户所拥有角色的所有权限,Collection<? extends GrantedAuthority> userAuthorities = this.authentication.getAuthorities();此行为登录操作时应访问数据库将用户权限放入authentication中,也就是说,这一行将会把该用户所持角色的所有权限都查询出来。
此时我们的鉴权字符串(“prod:create”)被守门员getRoleWithDefaultPrefix()拿下,来看看守门员是怎么守住这球的:

原来是判断一下这球是不是假动作啊,该方法会对传入的(prod:create)进行组装,前面传入的这个defaultRolePrefix为null,所以直接返回role即可,也就是我们一开始传入的“prod:create”。
该比对了,prod:create字符串在权限集合roleSet中,即该用户有访问该接口的权限。
总的来说,鉴权过程为:从数据库中查询出当前登录用户的所有权限并交给security管理;注解@PreAuthorize(“hasAuthority(‘xxx’)”)来判断“xxx”是否在当前登录用户的权限集合中,在则200,不在则403。

 @GetMapping("/adm/adminTradeController/detail")
    @PreAuthorize("hasAuthority('trade:get:tradePayDetailVo')")
    @ApiOperation(value = "后台获取支付详情数据)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "tradeId", value = "订单ID", required = true, dataType = "int", example = "0"),
    })
    @LogAnnotation
    public Result<TradePayDetailVo> tradePayDetailVo(@RequestParam("tradeId") Integer tradeId) {
        return tradeService.getTradePayDetailVo(tradeId);
    }

@PreAuthorize(“hasAuthority(‘trade:get:tradePayDetailVo’)”)
在这里插入图片描述

@Component注解的作用

Spring自带的@Component注解及扩展:

@Component:定义Spring管理Bean(也就是将标注@Component注解的类交由spring管理)

@AspectJ风格的切面可以通过@Compenent注解标识其为Spring管理Bean,而@Aspect注解不能被Spring自动识别并注册为Bean,必须通过@Component注解来完成

@Component
@Aspect
@Order(5)
@Slf4j
public class ReportAspect {

    @Autowired
    private ThirdFeignClient thirdFeignClient;

    @Pointcut("@within(com.kamowl.kamo.cloud.third.open.annotation.Report) || @annotation(com.kamowl.kamo.cloud.third.open.annotation.Report)")
    public void pointCut() {

    }

    @AfterReturning(pointcut = "pointCut() && @annotation(report)", returning = "methodResult")
    public void doAfterAdvice(JoinPoint joinPoint, Report report, Object methodResult) {

        Result result = (Result) methodResult;

        ReportChannel[] channels = report.channel();
        for (ReportChannel channel : channels) {
            thirdFeignClient.upload(assembleReport(channel, report.type(), result.getData() + ""));
        }
    }

    private ReportDto assembleReport(ReportChannel channel, ReportType type, String uniqueId) {
        ReportDto reportDto = new ReportDto();

        reportDto.setChannel(channel);
        reportDto.setType(type);
        reportDto.setUniqueId(uniqueId);

        return reportDto;
    }
}

springboot2 valid @RequestBody @Valid 校验失效

https://blog.csdn.net/xxpxxpoo8/article/details/127551926

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

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

相关文章

Flutter | 使用 typedef 让回调更优雅

今天来谈谈 Flutter 的 typedef。 一. 熟悉的 VoidCallback 之前看 setState 源码的时候&#xff0c;发现它的参数是 VoidCallback&#xff1a; void setState(VoidCallback fn) {}VoidCallback 其实是一个自定义类型的无参数无返回值的匿名函数&#xff1a; /// Signature…

mybatis之配置优化and映射器

环境配置&#xff1a; mybatis可以配置成适应多种环境&#xff0c;但是要记住&#xff0c;尽管可以配置多个环境&#xff0c;但每个SqlSessionFactory实例只能选择一种环境。 虽然&#xff0c;MyBatis 中有两种类型的事务管理器:type("[JDBC|MANAGED]"&#xff09;…

Web进阶:Day3 移动端特点、百分比布局、Flex布局、实战演练

Web进阶&#xff1a;Day3 Date: January 7, 2023 Summary: 移动端特点、百分比布局、Flex布局、实战演练 移动端特点 移动端和PC端网页不同点 PC端网页和移动端网页的有什么不同&#xff1f; PC屏幕大&#xff0c;网页固定版心 手机屏幕小&#xff0c; 网页宽度多数为100%…

【Docker】(五)使用bind mounts修改Docker容器中的Nginx配置

1.前言 本系列文章记录了从0开始学习Docker的过程&#xff0c;Docker系列历史文章&#xff1a; &#xff08;一&#xff09;基本概念与安装使用 &#xff08;二&#xff09;如何使用Docker发布一个SpringBoot服务 &#xff08;三&#xff09;使用registry远程镜像仓库管理镜像…

axios拦截器、ElementUI

一、axios拦截器 1、axios模块的作用 是对基于http请求的封装。在浏览器对异步请求对象XMLHttpRequest进行封装 2、拦截器 ​ &#xff08;1&#xff09;请求拦截器&#xff1a;对客户端发起的请求进行统一的前期处理&#xff08;token、时间戳、cookie等&#xff09; ​ …

linux系统中利用QT实现绘制图和图标的方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用QT进行绘图和图标的方法。 第一&#xff1a;绘图和图表简介 绘图与图表在嵌入式里有的比较多&#xff0c;尤其是图表&#xff0c;我们常在股票里看到的“图表折线/曲线图/饼状图等”都可以用 Qt 的图表来实现。绘图…

生产制造业如何谋求数字化转型?需要哪些信息化系统做支撑?

生产制造业数字化转型有什么思路&#xff1f;生产制造业需要哪些信息化系统做支撑&#xff1f; 近年来&#xff0c;围绕新产品新模式新业态&#xff0c;国家重点部署了7个方向&#xff0c;包括数字化管理、平台化设计、智能化生产、网络化协同、个性化定制、服务化延伸、新型智…

Revit图纸问题:设置dwg图纸显示顺序和批量图纸编号

一、Revit中设置导入的dwg图纸的显示顺序 我们在实际工作中经常需要将各种DWG图纸导入到revit中进行参考&#xff0c;有时候希望它盖住已有模型&#xff0c;有时候又需要它在模型以下显示&#xff0c;即实现类似于CAD的图层显示顺序功能&#xff0c;应该如何才能实现呢&#xf…

Window Server 2022 无法安装网卡驱动 1219-v

安装过win10的朋友都知道,win10基本上不用自己下载驱动. 插上网线就能用. 但是今天在server2022上,死活无法安装成功. 原因有很多,网上也有很多资料. 重点: 其实不需要修改驱动配置, 只需要在驱动中选择对应驱动,比如: 1219[x]-LM,x标识很多版本,选择一个低一点的就可以了. …

MySQL - explain 执行计划详解

explain显示了MySQL如何使用索引来处理select语句以及连接表&#xff0c;可以帮助选择更好的索引和写出更优化的查询语句。 explain 查询结果如下&#xff1a; 字段说明&#xff1a; 列名说明id id列的编号是select的序列号&#xff0c;有几个select就有几个id&#xff0c;并…

IPEmotion的NVH噪声测试模块——坎贝尔图

德国IPETRONIK的IPEmotion软件除了可以对之前介绍的热管理试验及热管理台架试验、电性能试验和道路试验等各种进行基本的温度、模拟量和数字信号的采集分析外&#xff0c;无论专业版、开发版还是分析版均支持噪声分析模块。该模块支持噪声数据离线后处理&#xff0c;包括Campbe…

如何通过大数据赋能产业园区高质量发展

2022年年底&#xff0c;中共中央、国务院印发了《关于构建数据基础制度更好发挥数据要素作用的意见》(以下简称《数据二十条》)&#xff0c;以《数据二十条》出台为标志&#xff0c;我国数字经济发展从技术引领进入到数据驱动的新阶段&#xff0c;加快构建数据基础制度&#xf…

LINUX提权之第三方服务提权篇

前言 上一篇文章讲了一下环境变量提权不知道大家学习的怎么样了&#xff0c;今天给大家带来新的提权知识——“第三方服务提权”&#xff0c;本文会深入浅出讲解一下第三方服务提权的原理以及例子。 第三方服务 所谓的第三方服务可以大致理解为系统中安装的软件&#xff08;…

机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例

机器人中的数值优化|【二】最优化方法&#xff1a;最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbrock function为例 在上一节中提到了我们详细探讨了数值优化/最优化理论中的基本概念和性质&#xff0c;现在开始使用python对算法进行实现。上一节链接&am…

CVE-2021-25296 复现

# 漏洞描述 名称&#xff1a;Apache OFBiz rmi反序列化漏洞 cve编号&#xff1a;cve-2021-25296 危害&#xff1a;未授权远程命令执行 影响版本&#xff1a;Apache OFBiz < 17.12.06 OFBiz是一个非常著名的电子商务平台&#xff0c;是一个非常著名的开源项目&#xff0…

Python识别屏幕题目并模拟做题

前言 马上就要过年了&#xff0c;有许多小伙伴们本本还没拿到&#xff0c;还在苦苦刷题&#xff0c;一直及格不了&#xff0c;现在&#xff0c;我们用Python模拟做题&#xff0c;看看效果。 环境使用 python 3.9pycharm 模块使用 requestsreselenium谷歌驱动 import reimpor…

动态规划|474. 一和零

题目看上去很唬人&#xff0c;但是恰恰是这样说明该题设计的目的很强&#xff0c;指向dp的01背包&#xff0c;就是为了考01背包设计的。 像极了中学时代的那种看上去花里胡哨&#xff0c;实质上是根据考点设计出题的题目。&#xff08;这种题看破出题意图&#xff0c;往往都很简…

电脑是自动获取ip,VMware安装linux时候,设置固定ip并且能访问外网

首先虚拟机网络模式是NAT模式。设置主机名和打开网络&#xff0c;也可以不设置主机名&#xff1a;安装好后&#xff0c;设置linux的ip地址。执行vi /etc/sysconfig/network-scripts/ifcfg-ens33&#xff0c;修改里面的ip配置&#xff1a;注意IP的范围。查看ip的范围的方法如下图…

Day 5 Spring的后处理器

1 Spring后处理器Spring的后处理器是Spring对外开发的重要扩展点&#xff0c;允许我们介入到整个Bean实例化流程中来&#xff0c;以达到动态注册BeanDefinition&#xff0c;动态修改BeanDefinition&#xff0c;以及动态修改Bean的作用。BeanFactoryPostProcessor: Bean工厂后处…

基于蜜蜂算法求解电力系统经济调度(Matlab代码实现)

目录 1 蜜蜂优化算法 1.1 蜂群觅食机制 1.2 蜜蜂算法 1.3 流程 2 经济调度 3 运行结果 4 参考文献 5 Matlab代码实现 1 蜜蜂优化算法 蜜蜂算法( Bees Algorithm&#xff0c;BA) 由英国学者 AfshinGhanbarzadeh 和他的研究小组于 2005 年提出。该算法是一种有别于蚁群…