最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用validation攔截非法提交的數(shù)據(jù)的方法實(shí)現(xiàn)

 更新時間:2025年07月28日 09:38:34   作者:moxiaoran5753  
這篇文章主要介紹了Java使用validation攔截非法提交的數(shù)據(jù),包含依賴引入、實(shí)體類注解配置、控制器@Valid/@Validated使用規(guī)范,具有一定的參考價值,感興趣的可以了解一下

注意:本文使用的是Springboot 2.x版本,如果使用其他版本會略有差異,本文僅作拋轉(zhuǎn)引義,開發(fā)時需結(jié)合自己項(xiàng)目的實(shí)際情況來定。

一.引入依賴

 <dependency>
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-validation</artifactId>
 </dependency>

二.提交數(shù)據(jù)的實(shí)體類添加驗(yàn)證規(guī)則的注解

  需根據(jù)屬性的類型和業(yè)務(wù)規(guī)則添加相應(yīng)的注解

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

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

/**
 * @author: 
 * @Desc:
 * @create: 2025-04-14 10:32
 **/
@Data
public class StoreDeviceDTO {

    @NotNull(message = "storeId不能為空")
    private Long storeId;

    @NotBlank(message = "設(shè)備名稱不能為空")
    private String deviceName;

    @NotBlank(message = "設(shè)備圖片不能為空")
    @URL(message = "設(shè)備圖片必須是一個合法的URL地址")
    private String deviceImage;
}

三.在控制器方法上添加@Valid注解

@PostMapping("/addApply")
public AjaxResult add(@Valid @RequestBody StoreApplyDTO storeApplyDTO)
{
	storeApplyService.saveStoreApply(storeApplyDTO);
	return AjaxResult.success();
}

如果傳的集合類型的數(shù)據(jù),則比較特殊,需要在控制器類名上加上@Validated注解,同時方法中也要加上上@Validated注解,正確的使用方式如下:

@RestController
@Validated
public class StoreDeviceController {
    @Autowired
    private IStoreDeviceService storeDevicesService;

   
    @PostMapping("/saveDevices")
    public AjaxResult saveDevices(@RequestBody @Validated List<@Valid StoreDeviceDTO> deviceDTOList) {
        storeDevicesService.saveDevices(deviceDTOList);
        return AjaxResult.success();
    }

}

其中@Valid和@Validated引用的包為:

import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;

為了給前端返回時是可讀性強(qiáng)的文字說明,而不是一堆英文說明,需要在全局異常處理類中添加如下代碼:

@RestControllerAdvice
public class GlobalExceptionHandler
{
   /**
     * 自定義驗(yàn)證異常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e)
    {
        //log.error(e.getMessage(), e);
        String message = e.getBindingResult().getFieldError().getDefaultMessage();
        return AjaxResult.error(message);
    }
}

第一個返回示例:

{
    "msg": "門店id不能為空",
    "code": 500
}

第二個返回示例(可進(jìn)一步優(yōu)化):

{
    "msg": "saveDevices.deviceDTOList[0].deviceName: 設(shè)備名稱不能為空, saveDevices.deviceDTOList[0].deviceImage: 設(shè)備圖片必須是一個合法的URL地址",
    "code": 500
}

拓展:分組校驗(yàn)

很多時候,有新增和修改操作,需進(jìn)行不同的驗(yàn)證,比如新增時無需帶id,而修改時必須帶id,此時可通過分組檢驗(yàn),以實(shí)現(xiàn)區(qū)別對接。下面是實(shí)現(xiàn)的過程:

1.創(chuàng)建新建和修改的分組interface

//新增
public interface AddGroup {
}
//修改
public interface UpdateGroup {
}

2.請求體添加分組注解

import com.bbc.validate.group.AddGroup;
import com.bbc.validate.group.UpdateGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.*;
import java.util.List;

/**
 * @author: 
 * @Desc:
 * @create: 2025-03-22 14:34
 **/
@Data
@ApiModel(description = "認(rèn)證項(xiàng)目請求體")
public class CertificateDTO {

    @ApiModelProperty("申請認(rèn)證ID")
    @NotNull(message = "申請認(rèn)證ID不能為空",groups ={UpdateGroup.class})
    private Long id;

    @NotNull(message = "storeId不能為空",groups ={AddGroup.class,UpdateGroup.class})
    private Long storeId;

    @NotBlank(message = "認(rèn)證項(xiàng)目不能為空",groups ={AddGroup.class,UpdateGroup.class})
    @ApiModelProperty("認(rèn)證項(xiàng)目")
    private String project;

    @NotNull(message = "請上傳證書材料", groups = {AddGroup.class})
    @Size(min = 1, max = 9, message = "請上傳1-9張證書材料圖片", groups = {AddGroup.class, UpdateGroup.class})
    @ApiModelProperty("認(rèn)證項(xiàng)目材料圖片(1-9張)")
    private List<String> certificateMaterials;

    @Size(max = 200, message = "認(rèn)證說明最多200個字符")
    @ApiModelProperty("認(rèn)證說明/備注(最多200字)")
    private String instructions;
}

3.controller中的方法添加了分組

@ApiOperation("新增認(rèn)證管理")
@Log(title = "認(rèn)證管理", businessType = BusinessType.INSERT)
@PostMapping("/saveProject")
@RepeatSubmit(interval = 5000, message = "不允許重復(fù)提交,請稍候再試")
public AjaxResult add(@Validated(AddGroup.class) @RequestBody CertificateDTO certificateDTO)
{
	certificateService.saveCertificateProject(certificateDTO);
	return AjaxResult.success();
}

/**
 * 修改認(rèn)證管理
 */
@ApiOperation("修改認(rèn)證管理")
@Log(title = "認(rèn)證管理", businessType = BusinessType.UPDATE)
@PutMapping("/editProject")
public AjaxResult edit(@Validated(UpdateGroup.class) @RequestBody CertificateDTO certicateDTO)
{
	certificateService.updateCertificateProject(certicateDTO);
	return AjaxResult.success();
}

避坑指南:

如果DTO類某個屬性添加了分組校驗(yàn),但Controller方法未指定校驗(yàn)分組,會導(dǎo)致分組校驗(yàn)失效,沒有添加分組注解的基礎(chǔ)校驗(yàn)仍然有效。

情況說明:

1. 默認(rèn)行為

  • 未指定分組:當(dāng)Controller方法沒有使用@Validated指定分組時,只會校驗(yàn)沒有分組的約束注解
  • 有分組注解:帶有groups屬性的校驗(yàn)注解將被跳過(因?yàn)闆]有添加@Validated注解)

2. 示例分析

public class CertificateDTO {
    @NotEmpty(message = "證書材料不能為空", groups = {AddGroup.class})  // 有分組
    private List<String> certificateMaterials;
    
    @Size(max = 200)  // 無分組
    private String instructions;
}

在Controller中:

@PostMapping
public void save(@RequestBody @Valid StoreCertificateDTO dto) {
    // 只會校驗(yàn)instructions字段
    // certificateMaterials不會被校驗(yàn),因?yàn)槲粗付ˋddGroup分組
}

3. 解決方案

方案1:在Controller類上添加@Validated注解

@RestController
@Validated(AddGroup.class)  // 指定默認(rèn)分組
public class CertificateController {
    @PostMapping
    public void save(@RequestBody @Valid CertificateDTO dto) {
        // 現(xiàn)在會校驗(yàn)AddGroup分組和沒有分組的約束
    }
}

方案2:在方法參數(shù)上指定分組

@PostMapping
public void save(@RequestBody @Validated(AddGroup.class) StoreCertificateDTO dto) {
    // 明確指定校驗(yàn)分組
}

方案3:混合使用(推薦)

@RestController
@Validated  // 類級別啟用校驗(yàn)
public class CertificateController {
    @PostMapping("/add")
    public void add(@RequestBody @Validated(AddGroup.class) StoreCertificateDTO dto) {
        // 添加操作使用AddGroup分組
    }
    
    @PostMapping("/update")
    public void update(@RequestBody @Validated(UpdateGroup.class) StoreCertificateDTO dto) {
        // 更新操作使用UpdateGroup分組
    }
}

4. 重要注意事項(xiàng)

@Valid vs @Validated

  • @Valid(JSR-303)不支持分組
  • @Validated(Spring擴(kuò)展)支持分組

默認(rèn)校驗(yàn)

  • 沒有分組的約束注解總是會被校驗(yàn)
  • 有分組的約束只在指定對應(yīng)分組時才會校驗(yàn)

繼承關(guān)系

  • 分組可以繼承,父接口的分組會被子接口繼承

分組雖好,使用不當(dāng)可能會得不到預(yù)期的結(jié)果,那么什么情況下要分組,什么情況下不分組呢:

5. 使用建議

  • 明確指定分組:重要的業(yè)務(wù)校驗(yàn)都應(yīng)該明確指定分組
  • 分層設(shè)計(jì)
    • 基礎(chǔ)校驗(yàn)(非空、格式等)可以不分組
    • 業(yè)務(wù)規(guī)則校驗(yàn)使用分組
  • 文檔注釋:在代碼中注明各分組的用途
  • 測試覆蓋:編寫測試驗(yàn)證分組校驗(yàn)是否按預(yù)期工作

到此這篇關(guān)于Java使用validation攔截非法提交的數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Java使用validation攔截非法提交內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • java finally塊執(zhí)行時機(jī)全面分析

    java finally塊執(zhí)行時機(jī)全面分析

    下面小編就為大家?guī)硪黄猨ava finally塊執(zhí)行時機(jī)全面分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • java 獲取路徑的各種方法(總結(jié))

    java 獲取路徑的各種方法(總結(jié))

    下面小編就為大家?guī)硪黄猨ava 獲取路徑的各種方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • Java+EasyExcel實(shí)現(xiàn)文件的導(dǎo)入導(dǎo)出

    Java+EasyExcel實(shí)現(xiàn)文件的導(dǎo)入導(dǎo)出

    在項(xiàng)目中我們常常需要Excel文件的導(dǎo)入與導(dǎo)出,手動輸入相對有些繁瑣,所以本文教大家如何在Java中輕松導(dǎo)入與導(dǎo)出Excel文件,感興趣的可以學(xué)習(xí)一下
    2021-12-12
  • Java利用ip2region實(shí)現(xiàn)獲取IP地址詳情

    Java利用ip2region實(shí)現(xiàn)獲取IP地址詳情

    ip2region是一個離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,10微秒級別的查詢效率,提供了眾多主流編程語言的?xdb?數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn)。本文將利用ip2region實(shí)現(xiàn)獲取IP地址詳情,感興趣的可以了解一下
    2022-07-07
  • 使用VisualVM分析日志

    使用VisualVM分析日志

    文章強(qiáng)調(diào)程序員需掌握多種工具(如JMeter、ELK、Prometheus等)應(yīng)對工作挑戰(zhàn),避免線上事故,重點(diǎn)介紹VisualVM作為Java故障排查工具,通過分析大對象和GC監(jiān)控,提升代碼質(zhì)量與問題定位效率
    2025-07-07
  • SpringBoot設(shè)置HTTP響應(yīng)狀態(tài)碼過程(HTTP Status Code)

    SpringBoot設(shè)置HTTP響應(yīng)狀態(tài)碼過程(HTTP Status Code)

    本文介紹了HTTP響應(yīng)狀態(tài)碼的分類及其在SpringBoot中的使用示例,狀態(tài)碼包括信息、成功、重定向、客戶端錯誤和服務(wù)器錯誤,常用的幾種狀態(tài)碼有200(請求成功)、400(客戶端錯誤)、404(資源未找到)和500(服務(wù)器內(nèi)部錯誤)
    2026-01-01
  • RabbitMQ交換機(jī)使用場景和消息可靠性總結(jié)分析

    RabbitMQ交換機(jī)使用場景和消息可靠性總結(jié)分析

    這篇文章主要為大家介紹了RabbitMQ交換機(jī)使用場景和消息可靠性總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • java實(shí)現(xiàn)掃雷游戲控制臺版

    java實(shí)現(xiàn)掃雷游戲控制臺版

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)掃雷游戲控制臺版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Springboot整合hibernate validator 全局異常處理步驟詳解

    Springboot整合hibernate validator 全局異常處理步驟詳解

    本文分步驟給大家介紹Springboot整合hibernate validator 全局異常處理,補(bǔ)呢文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • Java Predicate接口定義詳解

    Java Predicate接口定義詳解

    Predicate是Java中的一個函數(shù)式接口,它代表一個判斷邏輯,接收一個輸入?yún)?shù),返回一個布爾值,這篇文章主要介紹了Java Predicate接口的定義及示例代碼,需要的朋友可以參考下
    2025-04-04

最新評論

溧阳市| 肥西县| 孙吴县| 新乐市| 宜兴市| 司法| 桃源县| 阿克陶县| 瑞金市| 宜城市| 连云港市| 衡阳市| 逊克县| 澜沧| 安新县| 温宿县| 荃湾区| 保康县| 左云县| 南投县| 蕉岭县| 库伦旗| 醴陵市| 延庆县| 昭觉县| 漳州市| 桐乡市| 桃园县| 海盐县| 湖北省| 南宫市| 霍山县| 轮台县| 兴国县| 株洲县| 浦江县| 甘孜| 淮阳县| 资中县| 寿阳县| 聊城市|