This website requires JavaScript.

详解SptingBoot参数校验机制,使用校验不再混乱

前言

Spring Validation 验证框架提供了非常便利的参数验证功能,只需要@Validated或者@Valid以及一些规则注解即可校验参数。

本人看网上很多 SpringBoot 参数校验教程以 "单个参数校验""实体类参数校验" 这两个角度来分类(或者"Get 方法"和"Post 方法"分类,实际上也是一样的,甚至这种更容易让人产生误解)。 这种分类很容易让人觉得混乱:注解 @Validated一会要标在类上面,一会又要标在参数前;异常又要处理BindException,又要处理ConstraintViolationException。 刚看的时候可能还记得住,过一段时间就容易记混了,特别是当两种方式同时在一个类里,就不记得到底怎么用,最后可能干脆全部都加上@Validated注解了。

本文就从校验机制的角度进行分类,SpringBoot 的参数校验有两套机制,执行的时候会同时被两套机制控制。 两套机制除了控制各自的部份外,有部分是重叠的,这部分又会涉及优先级之类的问题。 但是只要知道了两个机制是什么,且了解 Spring 流程,就再也不会搞混了。

Read more

树莓派Docker部署使用Openwrt

环境

  • 硬件:树莓派 4B 4G 内存
  • 系统:RaspbianOS 32 位系统

Snipaste_2021-05-15_15-57-21

Read more

《深入理解Java虚拟机》中一题引发的思考

1 - 引言

在阅读『深入理解 Java 虚拟机(第 3 版)』时看到里面的一道代码题目,书中给出了题目的解答。自己对于这个题目拓展的想了几个变式,结果有所差异,为了寻找产生差异的原因又深入了解了一番。

2 - 类初始化时机

2.1 - 原题

在『深入理解 Java 虚拟机(第 3 版)』的 7.2 章节 "类加载的时机",其代码清单 7-1 有这么一段代码:

public class SuperClass {
    static {
        System.out.println("SuperClass init!");
    }

    public static int VALUE = 1;
}

public class SubClass extends SuperClass {
    static {
        System.out.println("SubClass init!");
    }
}

public class Main {

    public static void main(String[] args) {
        System.out.println(SubClass.VALUE);
    }
}
Read more

Service调用其他Service的private方法, @Transactional会生效吗(下)

前情提要:

Service 调用其他 Service 的 private 方法,@Transactional 会生效吗(上) 中证明了动态代理不会代理 private 方法的,并通过阅读源码证实了。

但是我们可以自己实现一个动态代理功能替代Spring Boot中原有的,达到动态代理 private 方法的目的。

主要流程为:

  1. 重新实现一个ProxyGenerator.generateClassFile()方法,输出带有 private 方法的代理类字节码数据
  2. 把字节码数据加载到 JVM 中,生成 Class
  3. 替代Spring Boot中默认的动态代理功能,换成我们自己的动态代理。
Read more

Service调用其他Service的private方法, @Transactional会生效吗(上)

省流大师:

  1. 一个 Service 调用其他 Service 的 private 方法,@Transactional 会生效吗

  2. 正常流程不能生效

  3. 经过一番操作,达到理论上可以

本文基于 Spring Boot 2.3.3.RELEASE、JDK1.8 版本,使用 Lombok 插件

Read more