springboot+swagger项目中,controller引入@NotEmpty等校验注解的问题

springboot项目

springboot+swagger项目中,controller层如果使用对基本数据类型使用 @NotEmpty @Length 等校验注解,controller会获取不到值,加了@RequestBody后可以获取到了,但是前端传值content-type必须是text/plain。所以建议control而用VO类接收参数,而不是用基本数据类型接收参数。

但ssm项目是没有这个问题的

以下都是controller层

不加@NotEmpty,可以接收到参数

    @PostMapping("find1")
    @ResponseBody
    public JsonResult find1(String userId) {
        return JsonResult.ok(userId);
    }

加@NotEmpty后接收不到参数

    @PostMapping("find2")
    @ResponseBody
    public JsonResult find2(@NotEmpty(message = "userId不能为空") String userId) {
        return JsonResult.ok(userId);
    }

@RequestBody @NotEmpty 可以接收到参数

但是与前端调试发现,前端发送请求的content-type 必须是 text/plain才可以。

    @PostMapping("find3")
    @ResponseBody
    public JsonResult find3(@RequestBody @NotEmpty(message = "userId不能为空") String userId) {
        return JsonResult.ok(userId);
    }

@NotEmpty(message = "userId不能为空") @RequestParam(value = "userId", required = false) 可以接收到参数

因为@RequestParam(“”)默认必传参数,没传的话,swagger就不会继续走下去。也就走不到@NotEmpty校验。

    @PostMapping("find4")
    @ResponseBody
    public JsonResult find4(@NotEmpty(message = "userId不能为空") @RequestParam(value = "userId", required = false) String userId) {
        return JsonResult.ok(userId);
    }

ssm项目

ssm项目就没这个问题。

    @PostMapping("find4")
    @ResponseBody
    public JsonResult find4(@NotEmpty(message = "userId不能为空") @RequestParam(value = "userId", required = false) String userId) {
        return JsonResult.ok(userId);
    }

看swagger发现,还是form表单提交,而不是application/json

<think>嗯,用户现在想了解如何实现Controller层。他们之前已经询问过后端订单创建接口的实现方案,现在可能是在构建整个后端系统,逐步深各个层次。我需要先回顾一下之前提供的方案,确保现在的回答与之前的保持一致,并且补充Controller层的具体实现细节。 首先,用户可能已经了解了请求验证层、业务处理层、持久层等,现在需要知道如何将这些整合到Controller层中。他们可能对Spring框架或者类似的MVC框架有一定的了解,但需要具体的代码示例和结构说明。 接下来,我需要考虑用户可能的实际需求。他们可能希望了解如何设计RESTful接口,处理校验,如何调用服务层,以及异常处理等。同时,用户可能关心如何保证接口的安全性,比如防止重复提交、数注等。 用户提到的之前的代码示例中使用了JavaSpring相关的技术,比如@Transactional、MyBatis等,因此在回答时应该保持技术栈的一致性,使用Spring MVC的注解和功能。 需要分步骤说明,结构清晰。可能需要包括请求口设计、校验、服务调用、响应封装、全局异常处理、安全防护、日志监控等方面。同时,提供代码示例会更有帮助,比如使用@RestController、@PostMapping等注解。 还要注意用户可能存在的误区,比如在Controller层做业务逻辑处理,这应该避免。需要强调Controller层应该保持简洁,主要负责接收请求、校验、调用服务层和返回响应。 此外,用户可能对如何测试Controller层感兴趣,但可能没有直接提问,所以可以简要提及单元测试或使用Postman测试接口。 最后,确保回答符合之前设定的系统级指令,比如使用正确的中文术语,LaTeX格式的行内公式(如果有的话),以及结构清晰的Markdown格式。</think>以下是Controller层实现的标准化方案,从请求处理到响应返回的完整流程说明: --- ### **一、基础请求处理框架** ```java @RestController @RequestMapping("/api/order") @Tag(name = "订单接口") // Swagger文档标注 public class OrderController { @Autowired private OrderService orderService; @PostMapping("/create") @Operation(summary = "创建订单") // OpenAPI描述 public ResponseResult<OrderCreateVO> createOrder( @Valid @RequestBody OrderCreateDTO dto, // 自动校验 @RequestHeader("X-Auth-Token") String token) { // 1. 基础校验(已在DTO通过注解实现) // 2. 业务处理 OrderCreateVO result = orderService.createOrder(dto); // 3. 构造响应 return ResponseResult.success(result); } } ``` --- ### **二、校验实现** #### 1. DTO校验注解示例 ```java @Data public class OrderCreateDTO { @NotNull(message = "用户ID不能为") @Min(value = 10000, message = "用户ID格式错误") private Long userId; @NotEmpty(message = "商品清单不能为") private List<@Valid OrderItemDTO> skuList; // 嵌套校验 } @Data public class OrderItemDTO { @NotBlank(message = "SKU编号不能为") @Pattern(regexp = "\\d{10}", message = "SKU编号格式错误") private String skuId; @Min(value = 1, message = "购买数量至少为1") private Integer quantity; } ``` #### 2. 全局校验异常处理 ```java @RestControllerAdvice public class ValidationHandler { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseResult handleValidationException(MethodArgumentNotValidE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值