吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2030|回复: 11
收起左侧

[Java 原创] Spring boot 接收POST请求以及验证 JSON 数据有效性

[复制链接]
0xCAFEBABE 发表于 2023-4-6 23:06
本帖最后由 0xCAFEBABE 于 2023-4-6 23:08 编辑

使用 Java 17 环境,Spring boot 3 框架

如何在控制器(Controller)中,接收来自客户端的 POST 请求,请求体(Body)为 JSON 格式的数据

并且使用检验用户输入的 JSON 数据是否有效

控制器:
[Java] 纯文本查看 复制代码
package com.example.demo.controller;

import com.example.demo.domain.Account;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;

@RestController
public class AccountController {

    @PostMapping()
    public Account account(@Valid @RequestBody Account account) {
        System.out.println(account);
        return account;
    }
}


数据类:
[Java] 纯文本查看 复制代码
package com.example.demo.domain;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import org.hibernate.validator.constraints.Range;

public record Account(
        @NotNull
        @Size(min = 4, max = 15)
        String name,
        @NotNull
        @Range(min = 0, max = 120)
        Integer age) {
}



需要用到的依赖 Jar 包,Maven 的 pom.xml 文件

[XML] 纯文本查看 复制代码
                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-validation</artifactId>
                </dependency>



免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
qiaosefennu + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

tq51117325 发表于 2024-3-18 17:30

补充一个自定义注解,校验参数中不能都为空。

本帖最后由 tq51117325 于 2024-3-18 17:35 编辑

[Java] 纯文本查看 复制代码
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

/**
 * 校验参数列表中,至少有一个不为空,参数为字符串、集合等
 */
@Documented
@Constraint(validatedBy = AtLeastOneNotNullValidator.class)
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public [url=home.php?mod=space&uid=593715]@interface[/url] AtLeastOneNotNull {
    String message() default "参数不能全为空";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}


[Java] 纯文本查看 复制代码
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

import java.lang.reflect.Field;
import java.util.Collection;

public class AtLeastOneNotNullValidator implements ConstraintValidator<AtLeastOneNotNull, Object> {

    @Override
    public void initialize(AtLeastOneNotNull constraintAnnotation) {
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }
        for (Field field : value.getClass().getDeclaredFields()) {
            try {
                field.setAccessible(true);
                Object fieldValue = field.get(value);
                if (fieldValue != null) {
                    if (fieldValue instanceof String && !((String) fieldValue).isEmpty()) {
                        return true; // 字符串不为空
                    } else if (fieldValue instanceof Collection && !((Collection<?>) fieldValue).isEmpty()) {
                        return true; // 集合不为空
                    } else if (!(fieldValue instanceof String) && !(fieldValue instanceof Collection)) {
                        return true; // 其他类型不为null
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
}
mancx 发表于 2023-4-9 10:16
校验@RequestParam/@PathVariable的参数需要在Controller类上加上@Validated注解,方法上和参数前加上无效
@RequestBody直接在参数前加上@Validated就行
13599383608 发表于 2023-4-7 08:35
需要在要使用校验的类上面加 @Validated 在你这个控制上面加就可以 单单使用@Valid没用
78zhanghao87 发表于 2023-4-7 09:16
好功能,学到了
暗黑惟我独尊 发表于 2023-4-7 09:33
@notblank lenth min max 用得多
qiaosefennu 发表于 2023-4-7 09:40
加油加油,希望可以看到更多的内容
Alice27 发表于 2023-4-8 22:51
谢谢分享!!!感谢
婷心mi 发表于 2023-4-9 13:09
有用 感谢分享
JooJS 发表于 2024-3-17 18:54
本帖最后由 JooJS 于 2024-3-17 18:55 编辑

我也是用 @RequestBody
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表