首页 > 其他分享 >微服务JSR303解析部署使用全流程

微服务JSR303解析部署使用全流程

时间:2024-09-28 10:20:03浏览次数:9  
标签:String JSR303 流程 private Result org import 解析 public

目录

1、什么是JSR303校验

2、小试牛刀

【2.1】添加依赖

【2.2】添加application.yml配置文件修改端口

【2.3】创建实体类User

【2.4】创建控制器

【2.5】创建启动类

【注意】不必创建前端页面

3、规范返回值格式:

3.1添加ResultCode工具类

3.2添加Result类

3.3添加ValidationExceptionAdvice工具类

4、ctrl中需要校验的参数类中添加注解

1、什么是JSR303校验

JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

JSR303是提案中的一个,用来做JavaBean校验的。

JSR是一个组织,用来收集整理java规范提案。任何人都可以提交提案,组织觉得有必要就会添加到新版本的jdk里。

2、小试牛刀

【2.1】添加依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
        <spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

【2.2】添加application.yml配置文件修改端口

server:
  port: 100

【2.3】创建实体类User

package com.jr.entry;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.stereotype.Component;
import javax.validation.constraints.NotNull;

@Component
@Data
public class User {

    private String id;

    // @NotNull   name为空地址
    @NotEmpty  //name为空值,空双引
    private String name;
    @Length(min = 6,max = 10)
    private String password;

}

【2.4】创建控制器

package com.jr.controller;

import com.jr.entry.User;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/demo")
public class DemoController {

    @PostMapping
    public String testJsr303(@Validated @RequestBody User user){
        return "ok";
    }
}

【2.5】创建启动类

@SpringBootApplication
public class SpringBootMain {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class,args);
    }
}

【注意】不必创建前端页面

1.使用@PostMapping注解时,接口要想成功接受到数据,需要使用x-www-form-urlencoded数据的格式发送数据。
2.使用@PostMapping+@RequestBody注解时,接口要想成功接受到数据需要使用raw数据的格式发送数据。  
3.但是使用html静态页面发送post请求时,数据是按照application/x-www-form-urlencoded;charset=UTF-8格式发送的,格式不符合,数据接收不到。

使用Postman 软件解决上述问题!

但是发现响应的值,虽然是json格式的。但是这个格式并不是咱们想要的,前台后台都是约定好的数据格式,如果你的数据格式发生了变化,那么就需要特殊处理了,很麻烦。所以我们要对响应的结果做一个处理。

3、规范返回值格式:

(这里的格式根据项目组来决定)

3.1添加ResultCode工具类

package com.jr.util;

public enum ResultCode {

    SUCCESS(0, "请求成功"),
    ERROR(1, "请求失败"),
    ;

    private int code;
    private String message;

    ResultCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

3.2添加Result类

创建工具类 util/Result

package com.jr.util;

import lombok.Data;
import java.util.HashMap;
import java.util.Map;

@Data
public class Result {

    private Integer code;

    private String message;

    private Map<String, Object> map = new HashMap<>();

    private Result() {
    }

    public static Result ok() {
        Result r = new Result();
        r.setCode(ResultCode.SUCCESS.getCode());
        r.setMessage(ResultCode.SUCCESS.getMessage());
        return r;
    }

    public static Result error() {
        Result r = new Result();
        r.setCode(ResultCode.ERROR.getCode());
        r.setMessage(ResultCode.ERROR.getMessage());
        return r;
    }

    public Result put(String key, Object value) {
        map.put(key, value);
        return this;
    }

    public Object get(String key) {
        return map.get(key);
    }

}

3.3添加ValidationExceptionAdvice工具类

package com.jr.advice;
import com.jr.util.Result;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RestControllerAdvice("com.jr.controller")
public class ValidationExceptionAdvice {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handlerMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        Map<String, Object> map = new HashMap<>();
        for (FieldError fieldError : fieldErrors) {
            map.put(fieldError.getField(), fieldError.getDefaultMessage());
        }
        return Result.error().put("data", map);
    }
}

【返回值格式修改后】

4、ctrl中需要校验的参数类中添加注解

空检查
@Null验证对象是否为null
@NotNull验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank检查约束字符串是不是Null还有被Trim的长度是否大于0
@NotEmpty检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue验证 Boolean 对象是否为 true
@AssertFalse验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=)验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=)验证字符串长度
日期检查
@Past验证 Date 和 Calendar 对象是否在当前时间之前
@Future验证 Date 和 Calendar 对象是否在当前时间之后
数值检查建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min验证 Number 和 String 对象是否大等于指定的值
@Max验证 Number 和 String 对象是否小等于指定的值
@Digits(Integer=,fraction=,message=“”)浮点型校验,Integer代表整数位数,fraction代表小数位数
格式检查
@Pattern验证 String 对象是否符合正则表达式的规则

【应用@Pattern注解】

import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;

/**
 * @author szsw
 * @date 2024/4/9 11:03:02
 */
@Data
public class User {

    private String id;
    @NotEmpty
    private String name;
    @Length(min = 6, max = 10)
    private String password;
    @Pattern(regexp = "^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$", message = "请输入正确的邮箱!")
    private String email;

}

说明:数据校验一定要前后台都校验,前台校验 可以拦截部分请求,后台检验可以 保证数据的安全性。

标签:String,JSR303,流程,private,Result,org,import,解析,public
From: https://blog.csdn.net/m0_71240584/article/details/142610136

相关文章

  • 开源电商系统启航电商ERP系统几个核心流程的设计说明
    1、订单拉取流程开放平台拉取订单模块消息队列订单处理模块拉取订单请求订单数据发送订单通知......
  • 案例运行结果及解析
    说明:此文解释上期https://blog.csdn.net/weixin_61767383/article/details/142425642?spm=1001.2014.3001.5502案例运行结果运行结果:Q1.为什么a的值是22,bo1的值是true?A:最初a赋值是20,++a,变为21,然后执行&&前面的语句,此时是true接着a还是21,执行&&后的语句,此时结果也是true,......
  • LlamaParse - 文档解析
    文章目录一、关于LlamaParse价格LlamaCloud例子二、使用入门三、与文件对象一起使用四、`SimpleDirectoryReader`一、关于LlamaParsegithub:https://github.com/run-llama/llama_parseLlamaCloud文档:https://docs.cloud.llamaindex.ai/LlamaParse是LlamaCl......
  • 一站式解决方案:10款PM工程项目管理软件深度解析
    市面上主流的10款PM工程项目管理系统推荐:PingCode、Worktile、飞书、金和项目管理、致远协同办公、Asana、Trello、JIRA、Basecamp、Monday.com。在现代企业管理中,项目的复杂性常常让人感到无从应对,错失进度和预算控制的情况屡见不鲜。选择合适的PM工程项目管理系统,不仅可以......
  • freeRTOS源码解析4--tasks.c 6
    4.2.14退出阻塞--xTaskAbortDelay接口:BaseType_txTaskAbortDelay(TaskHandle_txTask)形参1:xTask,想要退出阻塞态的任务;返回:pdPASS:退出成功;pdFAIL:退出失败。1BaseType_txTaskAbortDelay(TaskHandle_txTask)2{3TCB_t*pxTCB=xTask;4BaseType_tx......
  • 【AIGC】ChatGPT提示词解析:如何生成爆款标题、节日热点文案与完美文字排版
    博客主页:[小ᶻZ࿆]本文专栏:AIGC|ChatGPT文章目录......
  • 队列的深度解析:链式队列的实现
    引言队列是一种广泛应用于计算机科学的数据结构,具有先进先出(FIFO)的特性。在许多实际应用中,例如任务调度、缓冲区管理等,队列扮演着重要角色。本文将详细介绍队列的基本概念,并通过链表实现一个简单的队列。一、基本概念1.1定义队列是一种线性数据结构,遵循先进先出(FIFO,Firs......
  • 《破晓传说》d3dcompiler_43.dll缺失启动遇阻?d3dcompiler_43.dll丢失问题全解析与解决
    《破晓传说》在启动过程中遇到d3dcompiler_43.dll缺失的问题,确实会导致游戏无法正常运行。这个问题通常与DirectX组件的完整性或兼容性有关。以下是对d3dcompiler_43.dll丢失问题的全解析与解决方案:问题解析d3dcompiler_43.dll是什么?d3dcompiler_43.dll是DirectX的一部分,它......
  • 蓝牙定位导航系统深度解析:技术原理、实现步骤与实战应用
    随着物联网(IoT)技术的飞速发展,蓝牙低功耗(BLE)技术凭借其低功耗、高兼容性及短距离通信的优势,在各类定位系统中占据了重要地位。其中,蓝牙定位导航系统作为室内定位解决方案的佼佼者,正逐步改变着我们的生活方式。本文将深入探讨蓝牙定位导航系统的技术原理、关键技术、实现步骤,并通......
  • 智慧充电平台/充电桩管理系统/小程序/APP的开发流程
    智慧充电平台开发方案旨在打造一个集充电设施管理、用户服务、数据分析与优化于一体的综合性平台,以提升电动汽车充电的便捷性和效率。以下是一个详细的开发方案概述:一、需求分析‌市场与用户调研‌:了解当前电动汽车充电市场的现状、发展趋势。收集用户对充电设施的需求、使......