0

0

Spring Validation:抽象请求参数类的优雅实践

花韻仙語

花韻仙語

发布时间:2025-10-15 12:31:00

|

477人浏览过

|

来源于php中文网

原创

spring validation:抽象请求参数类的优雅实践

本文旨在解决Spring应用中,如何针对不同类型的报告生成需求,设计可扩展且易于维护的请求参数验证方案。核心思路是利用继承和组合,结合Spring Validation框架,实现对抽象请求参数类的灵活验证,从而避免修改核心接口,提升代码的健壮性和可扩展性。

在Spring Boot应用中,处理不同类型的报告生成需求时,经常会遇到需要根据不同的报告类型,验证不同的请求参数。如果将所有可能的参数都放在一个DTO中,会导致DTO过于臃肿,且验证逻辑复杂。本文将介绍一种基于抽象类和继承的解决方案,结合Spring Validation框架,实现可扩展且易于维护的请求参数验证。

方案概述

核心思想是定义一个抽象的请求参数类ReportRequestDTO,其中包含所有报告类型通用的参数。然后,针对每种报告类型,创建具体的DTO类,继承自ReportRequestDTO,并添加该报告类型特有的参数。

在Controller层,接收ReportRequestDTO类型的参数,然后根据报告类型,将其转换为对应的具体DTO类型,并进行验证。

具体实现

1. 定义抽象请求参数类

import lombok.Data;
import javax.validation.constraints.NotEmpty;

@Data
public abstract class ReportRequestDTO  {
    @NotEmpty(message = "Foo不能为空")
    private String foo;

    @NotEmpty(message = "Bar不能为空")
    private String bar;

}

ReportRequestDTO定义了所有报告类型通用的参数foo和bar,并使用@NotEmpty注解进行非空验证。

2. 定义具体请求参数类

import lombok.Data;
import javax.validation.constraints.NotEmpty;

@Data
public class ReportADTO extends ReportRequestDTO  {
    @NotEmpty(message = "Foobar不能为空")
    private String foobar;
}

ReportADTO继承自ReportRequestDTO,并添加了ReportA类型报告特有的参数foobar,同样使用@NotEmpty注解进行非空验证。

3. Controller层实现

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import javax.validation.Validator;
import java.util.Set;
import javax.validation.ConstraintViolation;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;

@RestController
public class ReportController {

    @Autowired
    private Validator validator;

    @GetMapping("/report")
    @ResponseBody
    public ResponseEntity getReport(
            @RequestParam(value = "category") String category,
            @Valid ReportRequestDTO reportRequestDTO) {

        // 根据category选择不同的DTO进行验证
        if ("A".equals(category)) {
            ReportADTO reportADTO = convertToReportADTO(reportRequestDTO);
            validate(reportADTO);
            // 调用生成ReportA的方法
            return ResponseEntity.ok("ReportA generated with foobar: " + reportADTO.getFoobar());
        } else {
            validate(reportRequestDTO);
            // 调用生成通用Report的方法
            return ResponseEntity.ok("Generic Report generated");
        }
    }

    private ReportADTO convertToReportADTO(ReportRequestDTO reportRequestDTO) {
        ReportADTO reportADTO = new ReportADTO();
        reportADTO.setFoo(reportRequestDTO.getFoo());
        reportADTO.setBar(reportRequestDTO.getBar());
        // 这里可以根据实际情况进行更复杂的转换
        return reportADTO;
    }

    private  void validate(T obj) {
        Set> violations = validator.validate(obj);
        if (!violations.isEmpty()) {
            StringBuilder sb = new StringBuilder();
            for (ConstraintViolation violation : violations) {
                sb.append(violation.getMessage()).append("; ");
            }
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, sb.toString());
        }
    }
}

在getReport方法中,首先根据category参数判断报告类型。然后,如果报告类型为A,则将ReportRequestDTO转换为ReportADTO,并使用validator.validate()方法进行验证。如果验证失败,则抛出异常。

Synthesys
Synthesys

Synthesys是一家领先的AI虚拟媒体平台,用户只需点击几下鼠标就可以制作专业的AI画外音和AI视频

下载

注意:

  • @Valid ReportRequestDTO reportRequestDTO 只是验证了ReportRequestDTO本身的约束,并不会验证子类的约束。
  • 需要手动将ReportRequestDTO转换为对应的子类DTO,并进行验证。
  • 可以使用javax.validation.Validator接口进行手动验证。

4. 全局异常处理 (可选)

为了更好地处理验证失败的情况,可以定义一个全局异常处理器,将ConstraintViolationException转换为友好的错误信息。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import javax.validation.ConstraintViolationException;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity handleValidationException(ConstraintViolationException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

总结

通过定义抽象请求参数类和具体的请求参数类,并结合Spring Validation框架,可以实现对不同类型的报告生成需求,进行灵活且可扩展的参数验证。这种方案避免了修改核心接口,提高了代码的健壮性和可维护性。同时,使用javax.validation.Validator接口可以进行手动验证,更加灵活地控制验证流程。

注意事项:

  • 在实际应用中,可能需要根据具体的业务需求,调整DTO的结构和验证逻辑。
  • 可以使用BeanUtils.copyProperties()方法进行DTO之间的转换,但需要注意类型转换和空指针异常。
  • 可以考虑使用分组验证,针对不同的场景,应用不同的验证规则。

希望本文能够帮助你更好地理解和应用Spring Validation框架,解决实际开发中的问题。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

107

2025.08.06

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

135

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

390

2023.10.12

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

69

2025.08.19

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

34

2025.12.22

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

114

2025.12.24

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

135

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

390

2023.10.12

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

4

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.8万人学习

C# 教程
C# 教程

共94课时 | 7.3万人学习

Java 教程
Java 教程

共578课时 | 49.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号