![author avatar](https://guqing-blog.oss-cn-hangzhou.aliyuncs.com/d5399ade-9263-4b58-9db7-a7da54c93310.png)
guqing
毕生所求无它,爱与自由而已
SpringBoot如何优雅的处理参数校验
解决方案 对于以上问题,SpringBoot项目我列举了三种处理方式: 对于前端传参的实体我们可以写这样一个类例如UserParam,然后使用javax.validation提供的注解进行参数条件限制 基于这样一个类,提出了两种关于aop的方式和一种异常处理的方式 AOP参数校验方式一 写一个AOP参数校验的类: 然后在controller中使用如下,只需要在参数UserParam前添加@Valid即可完成参数校验 AOP参数校验方式二 同样写一个aop参数处理类 在controller中使用 如上,不同点在于不仅需要在UserParam参数前写@Valid,还需要多添加一个参数BindingResult result才可以 全局异常处理参数校验 写这样一个异常处理类 在controller中使用 只需要在需要进行参数校验的参数UserParam前添加@Valid即可,当校验不通过时会被ValidExceptionAdvice类拦截处理 @Valid注解说明 java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现,因此具体注解使用参考Hibernate Validator,下面列举一些常见注解的使用说明: 注解 备注 @Null 只能为null @NotNull 必须不为null @Max(value) 必须为一个不大于 value 的数字 @Min(value) 必须为一个不小于 value 的数字 @AssertFalse 必须为false @AssertTrue 必须为true @DecimalMax(value) 必须为一个小于等于 value 的数字 @DecimalMin(value) 必须为一个大于等于 value 的数字 @Digits(integer,fraction) 必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction @Past 必须是 日期 ,且小于当前日期 @Future 必须是 日期 ,且为将来的日期 @Size(max,min) 字符长度必须在min到max之间 @Pattern(regex=,flag=) 必须符合指定的正则表达式 @NotEmpty 必须不为null且不为空(字符串长度不为0、集合大小不为0) @NotBlank 必须不为空(不为null、去除首位空格后长度不为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 @Email 必须为Email,也可以通过正则表达式和flag指定自定义的email格式
通俗解释JAVA设计模式之观察者模式
3、使用场景例子 有一个微信公众号服务,不定时发布一些消息,此时,用户关注公众号那么用于就相当于观察者而公众号则是被观察者,当被观察者状态改变时(有新文章)则观察者会观察到状态改变(收到文章) 4、观察者模式具体实现 1、定义一个抽象被观察者接口 2、定义一个抽象观察者接口 3、定义被观察者,实现了Observerable接口,对Observerable接口的三个方法进行了具体实现,同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可。
给你的Arch Linux 清理空间腾出地方
我将清理的内容分成三部分,清理安装包缓存,清理孤立的软件包,以及清理日志。 清理安装包缓存 使用如下命令 不仅会删除未安装或旧版本的包文件缓存,也会将安装着的包的包文件缓存也一并删除。 清理孤立的软件包 使用如下命令 就可以删除孤立的软件包。 什么是孤立的软件包呢? 如果我再也不想要吃西餐了,那么已经买来的刀叉也没用了。 这个刀叉即孤立的软件包。 清理日志 使用如下命令 可以限制日志记录大小在50M,我使用一年没清理过,日志记录大概在2G左右。
如何使用自有数据创建大规模路网拓扑结构
完成之后,用鼠标点击路网可以看出已经从交叉口处断开了,到此数据处理完毕 安装Postgresql数据库 建议安装稳定版9.6版本 postgresql下载地址 window64位版下载地址 下载完成后,安装过程省略,无脑安装即可,比mysql简单多了 安装完成之后,需要安装postgis插件: 打开如下软件 然后选择数据库点下一步: 安装该插件之后就会有一个可以将shp的数据导入到postgres的工具了 创建数据库并增加gis功能 可以使用命令行或者是图形化界面创建数据库(我是用的Navicat) 有了数据库之后,需要给该数据库增加gis功能,在数据库中允许以下命令: 如Navicat新建查询: 或者命令行的方式: 然后导入shp的数据到数据库中,会自动建表,注意:存放shp文件的路径不要包含中文,文件名称不要包含中文,否则会导入失败。
Spring Boot2 开发:从入门到核心原理
.yml是YAML (Yet Another Markup Language另一种标记语言)的缩写 以前的配置文件按大多数都是用的是xxx.xml文件 而YAML是以数据为中心的,比json,xml等更适合做配置文件 YAML配置实例: 可以看到非常的简洁 7.2 YAML语法 k:(空格)v:表示一堆键值对(空格必须有); 以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的 属性和值也是大小写敏感的 7.3 值的写法 字面量:普通值(数字、字符串、布尔) 对象、Map(属性和值,键值对) 行内写法: 数组(List、Set) 用- 值表示数组中的一个元素 行内写法: 7.4 获取配置文件值(配置文件注入) 创建一个Person类 其中引用到一个Dog类 使用@ConfigurationProperties注解需要导入maven配置,编写yaml文件时就有提示 使用yaml配置文件给Person注入值: 然后写测试类 可以看到输出结果: 而对于application.properties的配置方式为: 如果输出结果出现乱码需要在IDEA编辑器设置编码 如果不使用@ConfigurationProperties注解,也可以使用@Value的方式获取配置文件中的值,@Value的key读取的是配置文件中的key 7.5 @Value获取值和@ConfigurationProperties获取值比较 测试功能 @ConfigurationProperties @Value 注入数据 批量注入配置文件中的属性 一个一个指定 松散绑定(松散语法) 支持 不支持 SpEL 不支持 支持 JSR303数据校验 支持 不支持 复杂类型封装 支持 不支持 JSR303数据校验(例如校验Email地址): 运行: 7.6 @PropertySource&@ImportResource 7.6.1 @PropertySource @PropertySource: 加载指定的配置文件 当配置比较多时如果全部放在全局的配置文件application中就会很乱,那么这时可以将一些配置文件抽取出来放在另一个配置文件中使用@PropertySource来加载,它接收一个value数组String[] value();可以同时指定多个配置文件,例如 @PropertySource(value={"classpath:person.properties"}) 7.6.2 @ImportResource @ImportResource: 导入Spring的配置文件,让配置文件里面的内容生效。
Manjaro 安装 MySQL 提示 loading libicuuc.so.65错误
安装Mysql 初始化Mysql 到了这一步报错了: 提示这一错误的原因是Manjaro系统中自带的libicu版本是64.2,而Mysql默认安装的是8版本需要libicuuc65版本。 这时候去github下载并编译安装进系统,并软链接到/usr/lib/目录下即可 安装libicuuc 创建软连接 之后再执行 看到下面的输出就表示初始化完成了 最后的er.aavg? dh6kZ是root用户的临时密码 配置 启动成功后,继续往下执行,如果启动失败,看status的日志,可能是数据目录权限不够,分配权限,或者可能报数据目录不是空的,修改/etc/mysql/my.cnf中的datadir为一个新的空目录。
如何为Linux新增swap交换空间
对于我使用manjaor linux作为日常操作系统用的就没有上述的考虑了,根据自己的使用情况,8G内存我设置8G或者2G其实都够用 分配swapfile作为交换空间步骤如下: 步骤 首先运行 查看一下物理内存大小和swap 我的显示8G并没有分配swap空间所以为0 创建swapfile文件 mkswap创建交换文件 swapon激活 查看增加后swap空间 设置开机自动挂载 在其中添加一行 添加之后我的完整fstab文件如下,自行参考: 其中/dev/sdb3一行是因为我挂载了磁盘的缘故 然后执行,自动挂载所有在fstab中的文件系统 到此就可以使用swapfile了 去掉swap 如果不想使用swap空间了,可以使用如下方法删除swapfile
在 Linux 终端下使用默认应用快速打开文件或文件夹
概述 一般我们想要打开文件夹的方法都是首先打开文件管理器,然后找到想打开的文件夹并双击打开它,或者想使用某个应用打开某个文件,比如用图片查看器打开一张图片,但是这样做的速度实在太慢了而且很不爽,比如我的鼠标左键就打游戏打坏了,哈哈哈哈。 xdg-open 对于上述这样的操作,有更简单而快速的方法,使用xdg-open xdg-open就是用来替代上述操作的,比如: 就像双击打开这个文件夹一样。 使用 描述 选项说明 为了方便使用,可以配置一个别名,zsh shell的用户配置~/.zshrc,默认shell用户配置~/.bashrc,在其中添加 这样就可以用open来替代xdg-open了,比如: 甚至你可以使用它来打开一个url 需要注意的是,url需要带上协议比如http/https
Docker 入门指南
docker组不等价于用户root,如果想要知道的更多关于安全影响,查看docker daemon attack surface 创建docker用户组并添加用户: 为docker用户组添加用户 然后注销账户重新登录,这样可以保证你的用户获得正确的权限 重新登录以后,确认你可以不使用sudo启动docker容器 卸载 你可以通 yum 卸载docker软件 列出所有以及安装的程序包 删除软件包 该命令不会删除docker镜像,容器,数据卷,或者用户创建的配置文件 如果要删除镜像,容器和数据卷,使用以下命令 镜像操作 从docker仓库搜索镜像 搜索到镜像以后,拉取镜像 查看本地所有docker镜像 删除指定的本地镜像 还可以在https://hub.docker.com搜索想要的镜像 容器操作 首先需要安装镜像 然后运行镜像 之后会产生一个容器(正在运行的软件) 步骤(以tomcat镜像为例): 搜索镜像 拉去docker镜像,我默认为latest,如果拉去镜像总是TLS handshake timeout超时可以配置docker镜像的加速器 拉取镜像: 根据镜像启动容器(-d表示后台运行) 运行成功后会得到一串id比如:bc41fb8f4d680d68b5c11f856d24e13f5e3fdaa4337593036388807416821a4b 可以使用docker ps查看哪些docker镜像在运行 停止运行中的容器 删除指定容器 删除以后只要镜像没有删除,下次启动镜像时就会创建容器,但是有tomcat容器是不能访问的,必须要做端口映射 端口映射 此时就可以使用公网ip或者如果是虚拟机就虚拟机本机ip:映射端口号访问了,如果不能访问,请检查防火墙的状态或者配置防火墙规则 查看docker日志 进入容器中(比如进入mysql的容器,就可以使用mysql- u root -p登陆进mysql了) 更多操作命令参考 常用环境搭建 安装mysql 如果使用常规方式启动mysql会发现并没有启动起来,查看你日志会发现 没有指定密码,这三个三处必须指定一个,安装时可以参考官方文档 但是没有做端口映射外部不能访问,如果要做端口映射 **注意:**如果默认latest安装,会安装mysql8版本,加密方式与之前都不同,所以使用sqlyog或其他客户端连接时会报错Plugin caching sha2 password could not be loaded:,解决方式自行百度。
Linux 入门指南:从零开始学习 Linux
组的操作实际上就是对/etc/group的操作 用户组添加 groupadd 选项 用户组名 常用选项: 案例:使用groupadd指令创建一个新的用户组,命名为Administrators groupadd Administr 用户组编辑 常用语法:groupmod 选项 用户组名 常用选项: 案例:修改Administrators用户组的id修改为502改为520,用户组名为admins groupmod -g 520 -n admins Administrators 用户组的删除 语法:groupdel 用户组名称 细节:如果需要删除某个用户组,但是当这个用户组是某个用户的主组是无法删除,只有将该组内的用户移走才可删除 权限操作 linux的权限操作与用户、用户组是兄弟操作 在Linux中分别有读、写、执行权限 读权限: 对于文件夹来说,读权限影响用户是否能够列出目录结构 对于文件来说,读权限影响用户是否可以查看文件内容 写权限: 对于文件夹来说,写权限影响用户是否可以在文件夹下创建/删除/复制到/移动到文档 对于文件来说,写权限影响用户是否可以编辑文件内容 执行权限 一般都是对于文件来说,特别是脚本文件 身份介绍 Owner身份(文件所有者) 由于Linux是多用户、多任务的操作系统,因此可能会常常有很多人在同时在某台主机上工作 但是每个人均可在主机上设置文件权限,让其成为个人的“私密文件”,即个人说有者因为 设置了适当的权限,除本人之外的用户无法查看文件内容 Group身份 与文件所有者同组的用户 与文件所有者同组最有用的体现就是多个团队在同一台主机上开发资源的时候 Others身份(其他人) 相对于所有者而言 Root用户(超级用户) 在Linux中神一样存在的用户,在所有用户中拥有最高的权限,管理着普通用户 权限设置 要设置权限就要知道文件的一些基本属性和权限的分配规则,在Linux中,ls命令 常用来查看文件的属性,用于显示文件的文件名和相关属性 ls -l 路径 【ls -l等价于ll】 权限属性信息说明: 权限分配中,均是rwx的三个参数组合,且位置不会变化,没有对应权限就用-表示 权限设置语法如下 语法:chmod 选项 权限模式 文档 注意事项: 常用选项: 权限模式:就是该文档需要设置的权限信息 文档:可以是文件也可以是文件夹,可以是相对路径,也可以是绝对路径 注意点:如果想要给文档设置权限,操作者要么是root用户,要么就是文档的所有者 字母形式 例如:给文件anaconda-ks.cfg设置权限,要求所有者拥有全部的权限,同组用户与所有者用户读和执行权限,其他用户只读权限 语法例如:chmod u+x,g+rx,o+r anaconda-ks.cfg 使用减还原:chmod u-x,g-rx,o-r anaconda-ks.cfg 等号加权限:chmod u=rwx,g=rx,o=r anaconda-ks.cfg 例如:如果anaconda-ks.cfg文件什么权限也没有可以使用root用户设置所有人都有执行权限,则可以写成 语法1:chmod +x anaconda-ks.cfg 语法2:chmod a=x anaconda-ks.cfg 语法3:chmod a+x anaconda-ks.cfg 数字形式 读:r 4 写:w 2 执行:x 1 没有任何权限:0 注意:在写权限的时候千万不要设置只写不能读这种奇葩权限,打不开给写权限没用 如果一个权限数字中但凡出现2与3这样的数字,则改权限有不合理的情况 在lunux中如果要删除一个文件,不是看文件有没有对应的权限,而是看文件的目录是否有写权限,如果有才可以删除 属主与属组 属主:所属的用户(文件的主人) 属组:所属的用户组 这两个信息会在文档创建时,使用创建者的信息(用户名,用户主组名称) 如果有时候删除某个用户,则改用户对应的文档的属主和属组信息就需要去修改 chown(重点) wn:owner 作用更改文档的所属用户 语法:chown 用户名 文档路径 如果是文件夹:chown -R 用户名 文档路径(-R递归,可选) 语法2:chown [-R] 用户名:用户组名 文档路径 作用2:改所属用户的同时更改所属用户组 chgrp(了解) 作用:更改文档的所属用户组 语法格式:chgrp [-R] 用户组名 文档路径 扩展 sudo(switch user do) 语法:sudo (选项) (参数) 选项说明: 参数 如何改变配置文件: 语法:visudo 即可打开语法与vim一样,如何编辑可以去找范例 案例:本身guqing用户不能添加用户,要求使用sudo配置,将其设置可以添加用户, 并且可以修改密码(但是不能修改root用户密码) 注意:再写sudo规则时不建议写直接形式的命令,而是写命令的完整路径,如何查看命令完整路径,可以使用which命令来查看 语法:which 指令名称 在添加好对应的规则之后就可以切换到guqing在去执行 此时要想使用刚才的规则,则以以下的命令进行 语法:sudo 执行的指令 使用sudo -l用户可以查看自己拥有那些权限 注意:sudo不是任何Linux分支都有的命令,常见CentOS与Ubuntu都存在sudo命令 cron/crontab计划任务 作用:操作系统不可能24小时都有人操作,有些时候想在指定的时间点去执行任务(例如:每天夜里2点去重新启动apache 但是不可能真的有人每天夜里2点去执行命令,此时可以交给计划任务程序去执行操作) 语法:crontab 选项 例如:crontab -l列出当前用户的计划列表 编辑计划任务:crontab -e 【重点】 计划任务的规则语法格式 计划任务一行就是一个计划: 计划规则:分 时 日 月 周 需要执行的命令 例如:想要每天的0点0分执行reboot指令则可以写成 crontab 权限问题:本身是任何用户都可以创建自己的计划任务、 但是超级管理员可以通过配置来设置某些用户不允许设置计划任务 Linux网络设置 首先知道网卡配置文件的位置 /etc/sysconfig/network-scripts 其中有两个配置文件:ifcfg-etc0,ifcfg-lo,命名格式是ifcfg-网卡名称 此处需要会使用网卡重启操作 语法1:service network restart 语法2:再有的分支版本中没有第一个语法,有一个共性的目录叫/etc/init.d 该目录放着很多服务的快捷方式,此处重启网卡命令还可以使用: /etc/init.d/network restart 重启单个网卡 停止某个网卡语法:ifdown 网卡名称 开启某网卡语法:ifup 网卡名称 如果需要重启则,先停止在开启 提示:在实际工作时不要随意禁用网卡 防火墙设置 防火墙:防范一些网络攻击 防水墙:bbs论坛贴吧,水军 防火墙有硬件防护墙与软件防火墙之分 防火墙选择性让请求通过,保证网络安全性 在当前的CentOS6.5中防火墙有一个名字叫iptables 【7.x中使用的是firewalld】 ①查看iptables是否开机启动 ②iptables 服务的启动/重启/关闭 语法1:service iptables start/stop/restart 语法2:/etc/init.d/iptables start/restart/stop ③查看防火墙的状态(规则) 语法1:service iptables status iptables -L(表示列出规则)【或者-L -n ,表示将显示方式单词转为数字】 设置端口开放 允许80端口开放 语法:iptables -I INPUT -p tcp --dport 80 -j ACCEPT 添加完规则以后需要保存操作 语法:/etc/init.d/iptables save CentOS7.x中设置防火墙规则 chkconfig服务配置 相当于windows下的开机启动项管理服务 在linux下并不是所有软件安装完成之后都会开机启动服务,有可能需要自己去添加 除此之外还可以查看和删除 查看服务 查看语法:chkconfig --list (check config) 删除服务(不会再开机启动,而并不是不能service start) 语法:chkconfig --del 服务名 例如:chkconfig --del httpd 添加开机启动服务 添加也只是添加上去,并不是添加后就会开机启动,这需要设置,也并不是所有的软件都有服务 如果想添加服务,必须通过service能都正常运行 语法:chkconfig --add 服务名 设置服务在某个级别下开机启动(重点) 设置单个级别启动语法:chkconfig --level 级别号 服务名 on/off 设置多个语法启动语法2:chkconfig --level 级别号级别号 服务名 on/off ntp服务 ntp作用:主要用于对计算机时间的同步管理操作 时间对服务器来说是很重要的,一般很多网站都需要读取服务器的时间来记录相关信息,如果时间不准则可能造成很大的影响 ①一次性同步时间(简单) ntpdate 时间服务器的域名或IP地址(如120.25.108.11) ②设置时间同步服务 服务名:ntpd 启动ntpd服务 语法:service ntpd start 软件管理 rpm软件管理 rpm的作用类似windows上的电脑管家中的管家管理,其主要作用就是对于linux服务器上的软件包进行管理操作 管理分为:查询、卸载、安装 查询 语法:rpm -qa|grep 关键词 选项:-q表示查询query,-a表示全部all 作用:查询某个软件的安装情况 案例:查询linux是否安装firefox,rpm -qa|grep firefox 卸载 语法:rpm -e 软件名称 描述:如果卸载软件存在依赖关系 解决办法:rpm -e 软件包名 -nodeps 软件的安装 想要装软件,和windows下一样,先得到软件包 软件包获取方式: a.去官网下载 b.不介意老版本的化,可以光盘镜像安装 一光盘为类,查看块状设备(光盘硬盘U盘。。)