Springboot 如何忽略 空的 json? - V2EX
mocxe2vwww
V2EX    Java

Springboot 如何忽略 空的 json?

  •  
  •   mocxe2vwww Oct 28, 2020 3040 views
    This topic created in 2022 days ago, the information mentioned may be changed or developed.

    例如:

    pubic String (@RequestBody UserForm userForm)

    userFrom 必须有一个属性不为 null, 且这个属性不是固定的。

    如果前端传一个{}会反序列化成一个所有属性都为空的 UserForm

    怎么做到检查 requestbody 不能为 {}

    有什么简单的方法么?

    Supplement 1    Oct 28, 2020
    20 replies    2020-11-12 11:07:39 +08:00
    baylee12
        1
    baylee12  
       Oct 28, 2020
    hibernate @vliad 注解了解下
    zhady009
        2
    zhady009  
       Oct 28, 2020
    @RequestBody(required = false)
    zhady009
        3
    zhady009  
       Oct 28, 2020
    看错了 无视..
    chendy
        4
    chendy  
       Oct 28, 2020
    你需要参数校验,并不需要判断传入的是不是“{}”
    mocxe2vwww
        5
    mocxe2vwww  
    OP
       Oct 28, 2020
    @chendy 问题是参数不是固定的,可以传{"name": "zsan"} 也可以传{"age" : 12, "gender": "男"} 只有传了某些字段才会进行验证
    superBearL
        6
    superBearL  
       Oct 28, 2020
    写一个检测函数,用反射实现
    WangZiyue
        7
    WangZiyue  
       Oct 28, 2020
    我第一想到的是 filter 里对 httpServletRequest 包装处理判断一下 body.
    mocxe2vwww
        8
    mocxe2vwww  
    OP
       Oct 28, 2020
    @superBearL 这是最后的办法嘛,有没有啥优雅的处理方式
    mocxe2vwww
        9
    mocxe2vwww  
    OP
       Oct 28, 2020
    @WangZiyue 没办法的时候 就只能这么做了。
    Aethyr
        10
    Aethyr  
       Oct 28, 2020
    一楼就给出了最便捷的方式

    @NotNull
    private Integer age;
    fengpan567
        11
    fengpan567  
       Oct 28, 2020
    楼上正解
    BBCCBB
        12
    BBCCBB  
       Oct 28, 2020
    这种一般就老老实实自己写 if else 校验了
    chendy
        13
    chendy  
       Oct 28, 2020
    @mocxe2vwww #5 那就老老实实写个校验逻辑喽
    xuanbg
        14
    xuanbg  
       Oct 29, 2020   1
    这个参数验证怎么能优雅得起来呢?你这个接口接收的参数被设计成绝对的灵活,没有丝毫的规则可言。这种设计本身就不优雅,你让参数校验怎么去优雅!
    zifangsky
        15
    zifangsky  
       Oct 29, 2020
    一个简单的办法是在 controller 中用反射校验每一个属性是否都为空,比如:

    /**
    * 检查是否所有属性都为空
    * @author zifangsky
    * @date 2020/10/29 11:05
    * @since 1.0.0
    * @param element 待处理对象
    * @return 返回 true 表示对象的所有参数都为空
    */
    public static <K> boolean checkIfAllFieldsEmpty(K element){
    if(element == null){
    return true;
    }

    Class<?> clazz = element.getClass();

    //1. 获取当前类及父类的所有属性
    List<Field> fieldList = new ArrayList<>();
    while (clazz != null){
    Field[] declaredFields = clazz.getDeclaredFields();
    fieldList.addAll(Arrays.asList(declaredFields));

    clazz = clazz.getSuperclass();
    }

    //2. 统一处理所有符合条件的属性
    for (Field field : fieldList) {
    //更改权限
    field.setAccessible(true);

    try {
    //对于字符串类型的属性除了要判断是否为空,还要再判断一次是否为空字符串
    if(field.getType().isAssignableFrom(String.class)){
    String fValue = (String) field.get(element);
    if(fValue != null && !"".equals(fValue.trim())){
    return false;
    }
    }else{
    Object fValue = field.get(element);
    if(fValue != null){
    return false;
    }
    }
    }catch (Exception e){
    //ignore
    }
    }

    return true;
    }

    public static void main(String[] args) {
    UserForm form1 = new UserForm("张三", "password", 18);
    UserForm form2 = new UserForm("", null, null);

    System.out.println("检查结果是:" + checkIfAllFieldsEmpty(form1));
    System.out.println("检查结果是:" + checkIfAllFieldsEmpty(form2));
    }
    smilekung
        16
    smilekung  
       Oct 30, 2020
    我们之前会加一层拦截器,对请求参数做 JSONSchemaValidate,绝对灵活
    THESDZ
        17
    THESDZ  
       Oct 30, 2020
    仔细思考了下
    1.一个接口所处理的情况一定是有限的
    2.每种情况的条件一定是确定的
    3.那么最后一个 else 的时候报错就行了
    mocxe2vwww
        18
    mocxe2vwww  
    OP
       Oct 31, 2020
    @smilekung 只能搞拦截器了,我本想着框架有没有现成的方式。
    mocxe2vwww
        19
    mocxe2vwww  
    OP
       Oct 31, 2020
    @zifangsky 不错 不错 谢谢
    Joker123456789
        20
    Joker123456789  
       Nov 12, 2020
    把 userForm 转成 json 字符串,String userFormStr = JSON.toJSONString(userForm);

    然后判断 userFormStr 是否等于{}
    About     Help     Advertise     Blog     API     FAQ     Solana     3741 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 100ms UTC 04:32 PVG 12:32 LAX 21:32 JFK 00:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86