如何配置Swagger Codegen Maven插件实现枚举不匹配返回Bad Request?
schemas:
accommodationDTO:
type: object
required:
- category
- masterCustomerSetId
- accommodationNm
- effectiveBeginDt
description: accommodation object
properties:
category:
required: true
type: string
enum:
- FARM
- APARTMENT
- HOUSE
当提交包含非法枚举值的请求时(如下),DTO中的`category`字段会被转为null传入控制器,我希望此时控制器直接返回Bad Request(400错误),请问如何通过Swagger配置实现该功能? ```json { ... "category": "TRASH CAN", ... }
解决方案
要实现非法枚举值的请求自动返回400错误,需要从代码生成配置和校验框架集成两方面入手:
1. 调整Swagger Codegen配置,生成带校验注解的DTO
修改swagger-codegen-maven-plugin的configOptions,新增两项校验相关配置:
<configOptions> <!-- 原有配置保留 --> <interfaceOnly>true</interfaceOnly> <java8>false</java8> <dateLibrary>java8</dateLibrary> <sourceFolder>.</sourceFolder> <throwsException>true</throwsException> <useTags>true</useTags> <!-- 新增配置 --> <enableBeanValidation>true</enableBeanValidation> <validateEnum>true</validateEnum> </configOptions>
enableBeanValidation:开启后会为生成的DTO字段添加JSR-380校验注解(如@NotNull、自定义枚举校验注解)validateEnum:强制对枚举类型生成校验逻辑,避免非法值被静默转为null
2. 启用校验框架(以Spring为例)
如果项目基于Spring框架,需完成以下步骤:
- 引入Spring Validation依赖:在Spring Boot中添加
spring-boot-starter-validation依赖即可 - 在控制器方法的请求体参数前添加
@Valid或@Validated注解,触发校验:
@PostMapping("/accommodation") public ResponseEntity<?> addAccommodation(@Valid @RequestBody AccommodationDTO dto) { // 业务逻辑处理 }
当请求包含非法枚举值时,Spring会自动抛出MethodArgumentNotValidException,默认返回400错误响应。
3. 非Spring项目的处理方式
如果不使用Spring,需要手动集成JSR-380实现(如Hibernate Validator),在控制器中手动触发校验:
- 初始化校验器实例
- 对传入的DTO执行校验
- 若存在校验错误,直接构造并返回400错误响应
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

