一般情况下,我们并不推荐在服务端做基础的数据校验,因为这有一个很主要的问题:它加重了服务器的负载,如果并发多,这种负载就更加明显。

如果我们跟踪一个简单的Controller方法执行过程,就会发现Spring的一个http请求所需要执行的代码实在太多了。

因为这种特性,所以spring很适合用于开发一些对实时性要求不太高,单实例并发不太高的系统,或者说它适合用于开发运行于资源比较充裕的环境。

spring后续应该允许工程师做更灵活的配置--允许不加载一些不需要的,不必要的。 虽然现在已经部分有了,但是还不太够,因为它现在实在有点庞杂了。

不过既然有这个功能,也不妨用用,例如如果前端不是那么给力的情况下,可以把一些压力负载在后端上。

又或者把大部分的业务逻辑就放在后端,前端存粹就是展示而已,这样即使更换前端代码,耗费在前端的时间也比较少。

网络上有许多例子,本文仅仅是为了做个笔记,我本人并不推荐这种做法--在服务端做一些简单的数据校验。

本文例子参考了 https://blog.csdn.net/weixin_44953227/article/details/121841128

以下是本人的例子。

运行环境:springboot-2.6.7,jdk17,windows11.

验证类-ValidMessage

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext; import study.config.anno.ValidIsPositive; public class ValidMessage implements ConstraintValidator<ValidIsPositive, String> { @Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(value==null || value.trim().equals("")) {
return true;
}
String message=value.trim();
if (message.contains("混吃等死") || message.contains("得过且过")) {
return false;
}
return true;
} }

注解-ValidIsPositive

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import javax.validation.Constraint;
import javax.validation.Payload; import study.config.validate.ValidMessage;
/**
* 验证消息是否积极
* @author lzfto
*
*/
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ValidMessage.class})
@Documented
public @interface ValidIsPositive {
String message() default "";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}

待验证对象-SaleInfo

public class SaleInfo {

    private Integer id;
@NotNull(message = "名称不能为空")
private String name;
@DecimalMax(message = "不能大于10000", value = "10000")
private BigDecimal qty;
private BigDecimal price;
private BigDecimal totalAmount;
@ValidIsPositive(message="请拼搏")
private String comments;
private Date addTime; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public BigDecimal getQty() {
return qty;
} public void setQty(BigDecimal qty) {
this.qty = qty;
} public BigDecimal getTotalAmount() {
return totalAmount;
} public void setTotalAmount(BigDecimal totalAmount) {
this.totalAmount = totalAmount;
} public Date getAddTime() {
return addTime;
} public void setAddTime(Date addTime) {
this.addTime = addTime;
} public BigDecimal getPrice() {
return price;
} public void setPrice(BigDecimal price) {
this.price = price;
} public String getComments() {
return comments;
} public void setComments(String comments) {
this.comments = comments;
} }

控制器方法

@RequestMapping("/spring/tran/")
@Controller
public class SpringTranController { @Autowired
private SaleMainService saleMainService; @RequestMapping("/addSaleInfo")
@ResponseBody
public Object addSaleInfo(@RequestBody @Valid SaleInfo saleInfo, Errors errors) {
if (errors.getAllErrors().size() > 0) {
return ValidUtils.getValidMapInfo(errors);
} try {
if (saleInfo.getTotalAmount()==null) {
saleInfo.setTotalAmount(saleInfo.getQty().multiply(saleInfo.getPrice()));
}
return saleMainService.sale(saleInfo);
} catch (InvalidDataException e) {
return PublicReturn.getUnSuccessful(e.getMessage());
}
catch (Exception e) {
return PublicReturn.getUnSuccessful(e.getMessage());
}
}
}

js-测试代码

var settings = {
"url": "http://localhost:9999/spring/tran/addSaleInfo",
"method": "GET",
"timeout": 0,
"headers": {
"Content-Type": "application/json"
},
"data": JSON.stringify({
"name": "大米",
"qty": 10000.1,
"price": 1000,
"comments": "混吃等死"
}),
}; $.ajax(settings).done(function (response) {
console.log(response);
});

返回的结果:

{
    "comments": "请拼搏",
    "qty": "不能大于10000"
}
 

spring数据验证的更多相关文章

  1. spring(7)--注解式控制器的数据验证、类型转换及格式化

    7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用Proper ...

  2. Spring MVC 数据验证——validate注解方式

    1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决这个问题.所以本次博客教程也是基于编码方式.仅仅是在原来的基础加上注解 ...

  3. Spring MVC 使用介绍(十五)数据验证 (二)依赖注入与方法级别验证

    一.概述 JSR-349 (Bean Validation 1.1)对数据验证进一步进行的规范,主要内容如下: 1.依赖注入验证 2.方法级别验证 二.依赖注入验证 spring提供BeanValid ...

  4. Spring MVC 使用介绍(十三)数据验证 (一)基本介绍

    一.消息处理功能 Spring提供MessageSource接口用于提供消息处理功能: public interface MessageSource { String getMessage(Strin ...

  5. Hibernate Validation,Spring mvc 数据验证框架注解

    1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...

  6. spring 4.0 注解数据验证2

    在spring 4.0 注解数据验证1中有基本的数据验证方法.还是那个POJO: package com.suyin.pojo; import java.lang.reflect.Field; imp ...

  7. Spring MVC 数据验证——validate编码方式

    1.导入jar包 validation-api-1.0.0.GA.jar这是比較关键的一个jar包,主要用于解析注解@Valid. hibernate-validator-4.3.2.Final.ja ...

  8. spring mvc数据验证

    今天来说一下.前段验证,与后端数据验证.大家都知道.在我们.注册与登陆的时候,往往需要对数据进行效验.那么前段我们都知道,可以使用,js去做处理. 今天主要讲解.后端的数据效验.这里我们采用Hiber ...

  9. spring 4.0 注解数据验证1

    通常情况下,数据验证都分为前台验证,后台验证.并且前台JS验证是肯定有的,那么其实验证的错误信息根本不必通过后台传过去,哪怕就是想国际化,前台JS也能够胜任. 如果前台验证足够了,那么如果还有不正确的 ...

  10. SpringMVC数据验证

    SpringMVC数据验证——第七章 注解式控制器的数据验证.类型转换及格式化——跟着开涛学SpringMVC 资源来自:http://jinnianshilongnian.iteye.com/blo ...

随机推荐

  1. [Go] 结构体成员的第三个位置上标签的作用

    结构体成员加了第三个位置的标签,在转换指定类型时,key 会使用指定的名字. package main import ( "encoding/json" "log&quo ...

  2. K8s集群中部署SpringCloud在线购物平台(一)

    一.安装k8s高可用集群 主机名 IP 配置 网络 master控制节点 192.168.10.10 centos 7.9 4核4G 桥接 node1工作节点 192.168.10.11 centos ...

  3. Prometheus+Grafana+alertmanager构建企业级监控系统(二)

    二.可视化UI界面Grafana的安装和配置 2.1 Grafana介绍 Grafana 是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通 知给告警接收方.它主要有以下 ...

  4. 微信小程序使用微信云托管添加自定义域名并转发到pexels.com

    背景:我要在小程序上显示pexels.com上的图片,然后我得先把pexels.com的域名添加到小程序的request合法域名中,但是pexels.com是国外的,在国内没有备案所以添加不了.解决方 ...

  5. 【项目学习】Anchor:一种提供稳定币存款低波动收益率的去中心化的储蓄协议

    简介 基于稳定币的获利产品. 贷方人放出稳定币以供借款.借方通过抵押资产(base asset)的方式,以低于协议定义的借贷比率借入稳定币.Anchor 协议使用抵押资产进行质押以获得奖励,然后将质押 ...

  6. es部署

    部署单机版es tar xf elasticsearch-7.16.0-linux-x86_64.tar.gz./bin/elasticsearch -dcan not run elasticsear ...

  7. 添加身份认证和鉴权方案-使用jwtbearer

    HTTP身份认证框架 RFC 7235 定义了一个 HTTP 身份验证框架,服务器可以用来质询(challenge)客户端的请求,客户端则可以提供身份验证凭据. 服务端开启了身份认证后.如果客户端访问 ...

  8. feign入门

    .net core: feign.net是一个spring cloud feign组件的c#移植版 https://github.com/daixinkai/feign.net 在.net core ...

  9. Android 13 - Media框架(7)- NuPlayer::Source

    关注公众号免费阅读全文,进入音视频开发技术分享群! Source 在播放器中起着拉流(Streaming)和解复用(demux)的作用,Source 设计的好坏直接影响到播放器的基础功能,我们这一节将 ...

  10. Wpf Bitmap(Image)Base64,Url,文件Path,Stream转BitmapSource(ImageSource),无需外部dll

    直接上代码 using System; using System.Drawing; using System.IO; using System.Windows.Forms; using System. ...