java中,如何解决@NotBlank不生效的问题 @NotBlank @NotEmpty不生效,以及对象嵌套问题

这篇文章主要介绍了如何解决@NotBlank不生效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。

1.解决@NotBlank不生效

最近做一个新项目,写新接口时发现@NotBlank @NotEmpty不生效,@NotNull则生效,令人费解。仔细检查一下2步骤

用法:

step1、Controller层接口入参处加@Validated注解(org.springframework.validation.annotation包的)

step2、入参对象的属性上加@NotBlank 或@NotEmpty 或 @NotNull –均来自于javax.validation.constraints包下, 三者区别可百度

 

属性循环嵌套问题,入参对象bean中 属性也为javabean对象,也希望子对象中的属性能够被校验

 

用法: 在子对象属性上面加@Valid 注解即可

WxCollectUserinfo.java
package com.joolun.system.domain;

import com.joolun.common.annotation.Excel;
import com.joolun.common.core.domain.BaseEntity;
import com.joolun.system.domain.vo.UserVo;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * 门店信息对象 wx_collect_userinfo
 * 
 * @author qiaosl
 * @date 2022-10-03
 */
public class WxCollectUserinfo extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 主键 */
    @Excel(name = "主键")
    private Long wcuId;

    @NotNull(message = "userVo不能为空")
    @Valid
    private UserVo userVo;

    /** 门店名称 */
    @NotBlank(message = "门店名称不能为空")
    @Excel(name = "门店名称")
    private String storesName;

    /** 用户名称 */
    @NotBlank(message = "姓名不能为空")
    @Excel(name = "用户名称")
    private String userName;

    /** 门店地址 */
    @NotBlank(message = "门店地址不能为空")
    @Excel(name = "门店地址")
    private String storesAddress;

    /** 手机号码 */
    @Excel(name = "手机号码")
    @NotBlank(message = "手机号码不能为空")
    private String userTelnumber;

    public void setWcuId(Long wcuId) 
    {
        this.wcuId = wcuId;
    }

    public Long getWcuId() 
    {
        return wcuId;
    }
    public void setStoresName(String storesName) 
    {
        this.storesName = storesName;
    }

    public String getStoresName() 
    {
        return storesName;
    }
    public void setUserName(String userName) 
    {
        this.userName = userName;
    }

    public String getUserName() 
    {
        return userName;
    }
    public void setStoresAddress(String storesAddress) 
    {
        this.storesAddress = storesAddress;
    }

    public String getStoresAddress() 
    {
        return storesAddress;
    }
    public void setUserTelnumber(String userTelnumber) 
    {
        this.userTelnumber = userTelnumber;
    }

    public String getUserTelnumber() 
    {
        return userTelnumber;
    }

    public UserVo getUserVo() {
        return userVo;
    }

    public void setUserVo(UserVo userVo) {
        this.userVo = userVo;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
            .append("wcuId", getWcuId())
            .append("storesName", getStoresName())
            .append("userName", getUserName())
            .append("storesAddress", getStoresAddress())
            .append("userTelnumber", getUserTelnumber())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}

  

UserVo.java

package com.joolun.system.domain.vo;

import javax.validation.constraints.NotBlank;

public class UserVo {

    @NotBlank(message = "title不能为空")
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

  

有任何需要沟通交流的联系

QQ群:276483863 

微信扫码:

 

 加好友备注【技术交流】
 

免费在线流程图、思维导图、专业强大的作图工具,支持多人实时在线协作,可用于原型图、UML、BPMN、网络拓扑图等多种图形绘制 感觉真不错推荐给大家! 

程序员可接私活的10个平台和一些建议,别掉坑里!

# 什么样的私活不能接
1、没有第三方担保的个人对个人的尽量不要接,双方都没保障,出了问题很大的可能撕破脸皮不了了之。

2、一上来就直接说给我开发一个什么软件,不说具体需求,没有需求文档的都不靠谱,这样的项目不要接。

3、尽量442收费方式,即开工收40%项目款,项目中期收40%项目款,项目结束收20%项目款。一开始不给钱的,尽量不要接,这一点一定要记住,否则很容易付出了劳动得不到应得的收入。

不给完钱,不交完整代码。你的成果就是代码,如果没给完钱,就把代码交给了对方,也容易被坑到。

# 国内远程工作平台,接单平台

1、CODING 码市

官方网站:https://mart.coding.net

著名的Coding旗下的互联网软件外包服务平台,平台以外包为主。

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922205705209-427594481.png)

2、 开源众包

官方网站:https://zb.oschina.net/projects/list.html

开源中国的众包平台,主要是以众包为主。

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922205811473-928364703.png)

什么是软件众包

目前软件众包分为简单任务和复杂任务,简单软件众包的任务可以由个人来承担,比较复杂的软件可以同时协同多人完成的任务

它的流程是:首先发包人对任务进行细分,分解到最小后,然后分包出去,按照各自的能力和知识水平领包,最后完成任务,发包人通过审核通过之后,项目才算完成。

3、猪八戒

官方网站:https://zbj.com

找兼职的地方,主要是入门级项目,不适合专业程序员,上面各类需求发布都有不限于软件开发行业,更适合新手。

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922205851660-1314917070.png)

4、程序员客栈

官方网站:https://www.proginn.com

程序员,产品经理,设计师等互联网相关人员,都能在上面找到适合自己的项目。支持自由、远程和兼职工作,还可以按需雇佣,工作模式非常多 。

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922205915792-1869388846.png)

5、英选

官方网站:http://linktion.cn

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922205939594-942076120.png)

虽然是外部平台,当他们还是针对外部项目的一些长期令人诟病的问题进行了一些优化,如下图:

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922210124056-861745408.png)

6. 开发邦

官方网站:http://www.kaifabang.com

特点:服务范围明确,IT开发项目垂直度高,能吸引到一部分需求明确的客户。

平台也致力于利用互联网软件技术为客户提高效率、降低成本、提升效能、优化管理。

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922210146065-853548247.png)

7、猿急送

官方网站:https://www.yuanjisong.com/

平台特点:追求高质量的雇主和工程师,汇聚了知名互联网公司的技术、设计、产品大牛,通过实际坐班、远程等方式,一对一为创业公司解决问题,提高创业效率。

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922210219734-1772251795.png)

8、人人开发

官方网站:http://rrkf.com

基于可视化快速开发平台 – 捷得(Joget)/捷得云(Joget Cloud)(PaaS),集众多开发者资源,为企业提供企业管理软件服务

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922210328233-1860389636.png)

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922210344120-1861259543.png)

国外远程工作平台

1、 Freelancer

官方网站:https://www.freelance.com/

工作类型主要覆盖了程序开发到市场营销、广告、会计等一系列的可以远程的工作。

![image](https://img2022.cnblogs.com/blog/543925/202209/543925-20220922210417770-1351127935.png)

双方信息对称很重要,诚信为本
1、一些私活多数是远程工作,这要求双方在需求沟通过程中信息能对称,特别作为乙方的程序员,需要培养自己良好的沟通能力,这样能减少因需求不明确导致的设计频繁修改,项目延期等问题,提高项目交付效率,建立信任关系。

2、目前程序员私活的市场现状是僧多肉少,在接单过程中很可能遇到同行竞争压价(一些工作室长期接单,积累大量框架模板,能比个人快很多的速度交付,通过降低开发成本,压低市场价格,另外一方面后续他们也会通过一些手段赚取客户更多,比如:收取相对高额的售后费用,骗取基于创业的小白缴纳一些系统加盟费之类的。

最好选择一到二个平台长期经营,能在本地找到长期合作方建立信任关系是最好。

【轻量应用服务器】k3s部署redis

1.在轻应用服务器中安装好K3s

2.登录k3s及token

 

3.登录上k3s,如下图

4.按照图下图操作,打开部署界面

 

5.部署redis,部署用的yaml如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:bullseye
        command:
        - redis-server
        - "/redis/redis.conf/redis.conf"
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: redis-data
          mountPath: /data
        - name: redis-config
          mountPath: /redis/redis.conf
      volumes:
        - name: redis-data
          hostPath:
            path: /root/data/redis
            type: Directory
        - name: redis-config
          hostPath:
            path: /root/data/redis-config
            type: Directory

 

注意:1.其中redis-config挂载,是为了自定义redis启动配置。

                     redis-data是redis的数据文件,挂载出来可以持久化,避免数据文件丢失。

           2.路径说明如下图

                    

 

 

 

           3.myql的dockerhub镜像地址

image: redis:bullseye

 

 编辑完成后,点击‘Upload’即可部署成功。

 

 此时,无法通过外网和服务间无法调用,需要部署service来实现,部署yaml如下

apiVersion: v1
kind: Service
metadata:
  name: redis-service
spec:
  type: NodePort
  selector:
    app: redis
  ports:
  - protocol: TCP
    port: 6379
    targetPort: 6379
    nodePort: 30001

 

 

注意:通过NodePort方式,将服务开启在了30000端口。

    

 

 

编辑完成后,点击‘Upload’即可部署service成功。

 

 

 

 此时,在该应用的防火墙里添加【3001】端口,即可外网正常访问redis了

 

Navicat 连接 MySQL8 出现 2059 错误的解决方案

叙述

工作中一直使用的是MySql 5.6版本,想着MySQL8已经发布好几年了,本地安装个测试数据库看看,但是安装完成后,用Navicat连接,一直报2059错误,真是奇了怪了。

 

排查

晚上查了原因,说是在MySql8之前的版本,默认的加密规则是mysql_native_password,而在MySql8后的版本,默认的加密规则已经调整为caching_sha2_password,由于Navicat不支持最新的caching_sha2_password加密规则,导致连接出错。

 

解决方案

知道原因后,解决起来也很简单,修改数据库用户的加密规则即可。

mysql -uroot -p ## 登录数据库
 
use mysql;
 
ALTER USER 'root'@'%' IDENTIFIED BY 'abc123' PASSWORD EXPIRE NEVER; ##修改加密规则,其中abc123为修改后的密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123';##修改密码
 
FLUSH PRIVILEGES; #刷新权限

 经过上述操作后,再用Navicat连接数据库,就可能正常连接。

 

【轻量应用服务器】k3s部署mysql

1.在轻应用服务器中安装好K3s

2.登录k3s及token

 

3.登录上k3s,如下图

4.按照图下图操作,打开部署界面

 

5.部署myql,部署用的yaml如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        args:
          - --lower_case_table_names=1
          - --character-set-server=utf8mb4
          - --collation-server=utf8mb4_unicode_ci
          - --default-time-zone=+8:00
        image: mysql:8.0.30-debian
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: 123.com
        ports:
        - containerPort: 3306
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-data
        - name: mysql-config
          mountPath: /etc/mysql
      volumes:
        - name: mysql-data
          hostPath:
            path: /root/data/mysql
            type: Directory
        - name: mysql-config
          hostPath:
            path: /root/data/mysql-config
            type: Directory

注意:1.其中mysql-config挂载,是为了自定义mysql启动配置。

                     mysql-data是mysql的数据文件,挂载出来可以持久化,避免数据文件丢失。

           2.路径说明如下图

                    

           3.myql的dockerhub镜像地址

image: mysql:8.0.30-debian

 

 编辑完成后,点击‘Upload’即可部署成功。

 

 此时,无法通过外网和服务间无法调用,需要部署service来实现,部署yaml如下

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  type: NodePort
  selector:
    app: mysql
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306
    nodePort: 30000

 

注意:通过NodePort方式,将服务开启在了30000端口。

   

编辑完成后,点击‘Upload’即可部署service成功。

 

 此时,在该应用的防火墙里添加【3000】端口,即可外网正常访问mysql了

 

添加docker权限给其他用户使用

#添加docker权限给其他用户(user)使用
usermod -a -G docker user

注意:

这样做会使你离开其他用户组,仅仅做为用户组 groupA 的成员。
应该加上 -a 选项:
usermod -a -G groupA user

(FC4: usermod -G groupA,groupB,groupC user)
-a 代表 append, 也就是将自己添加到用户组 groupA, 而不必离开原来到用户组。

nginx开启gzip

http {
# 开启gzip
gzip on;

# 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩
gzip_min_length 1k;

# gzip 压缩级别 1-10 
gzip_comp_level 2;

# 进行压缩的文件类型。

gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
}

  在http下加上上面的gzip代码

安装 Docker最简单的快速的方式

如果系统安装过先卸载一下。

curl https://releases.rancher.com/install-docker/1.10.sh  | sh
curl https://releases.rancher.com/install-docker/1.11.sh  | sh
curl https://releases.rancher.com/install-docker/1.12.sh  | sh
curl https://releases.rancher.com/install-docker/1.13.sh  | sh
curl https://releases.rancher.com/install-docker/17.03.sh | sh
curl https://releases.rancher.com/install-docker/17.04.sh | sh
curl https://releases.rancher.com/install-docker/17.05.sh | sh
curl https://releases.rancher.com/install-docker/17.06.sh | sh
curl https://releases.rancher.com/install-docker/17.07.sh | sh
curl https://releases.rancher.com/install-docker/17.09.sh | sh
curl https://releases.rancher.com/install-docker/17.10.sh | sh
curl https://releases.rancher.com/install-docker/17.12.sh | sh
curl https://releases.rancher.com/install-docker/18.03.sh | sh
curl https://releases.rancher.com/install-docker/18.06.sh | sh
curl https://releases.rancher.com/install-docker/18.09.sh | sh
curl https://releases.rancher.com/install-docker/19.03.sh | sh
curl https://releases.rancher.com/install-docker/20.10.sh | sh