例如:
pubic String (@RequestBody UserForm userForm)
userFrom 必须有一个属性不为 null, 且这个属性不是固定的。
如果前端传一个{}会反序列化成一个所有属性都为空的 UserForm
怎么做到检查 requestbody 不能为 {}
有什么简单的方法么?

例如:
pubic String (@RequestBody UserForm userForm)
userFrom 必须有一个属性不为 null, 且这个属性不是固定的。
如果前端传一个{}会反序列化成一个所有属性都为空的 UserForm
怎么做到检查 requestbody 不能为 {}
有什么简单的方法么?
2 zhady009 Oct 28, 2020 @RequestBody(required = false) |
3 zhady009 Oct 28, 2020 看错了 无视.. |
4 chendy Oct 28, 2020 你需要参数校验,并不需要判断传入的是不是“{}” |
5 mocxe2vwww OP @chendy 问题是参数不是固定的,可以传{"name": "zsan"} 也可以传{"age" : 12, "gender": "男"} 只有传了某些字段才会进行验证 |
6 superBearL Oct 28, 2020 写一个检测函数,用反射实现 |
7 WangZiyue Oct 28, 2020 我第一想到的是 filter 里对 httpServletRequest 包装处理判断一下 body. |
8 mocxe2vwww OP @superBearL 这是最后的办法嘛,有没有啥优雅的处理方式 |
9 mocxe2vwww OP @WangZiyue 没办法的时候 就只能这么做了。 |
11 fengpan567 Oct 28, 2020 楼上正解 |
12 BBCCBB Oct 28, 2020 这种一般就老老实实自己写 if else 校验了 |
13 chendy Oct 28, 2020 @mocxe2vwww #5 那就老老实实写个校验逻辑喽 |
14 xuanbg Oct 29, 2020 这个参数验证怎么能优雅得起来呢?你这个接口接收的参数被设计成绝对的灵活,没有丝毫的规则可言。这种设计本身就不优雅,你让参数校验怎么去优雅! |
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)); } |
16 smilekung Oct 30, 2020 我们之前会加一层拦截器,对请求参数做 JSONSchemaValidate,绝对灵活 |
17 THESDZ Oct 30, 2020 仔细思考了下 1.一个接口所处理的情况一定是有限的 2.每种情况的条件一定是确定的 3.那么最后一个 else 的时候报错就行了 |
18 mocxe2vwww OP @smilekung 只能搞拦截器了,我本想着框架有没有现成的方式。 |
19 mocxe2vwww OP @zifangsky 不错 不错 谢谢 |
20 Joker123456789 Nov 12, 2020 把 userForm 转成 json 字符串,String userFormStr = JSON.toJSONString(userForm); 然后判断 userFormStr 是否等于{} |