[apache/dubbo]Wrapper类在处理Json转换的时候无法处理Boolean 类型字段 isXX方法只匹配了 boolean类型

2024-05-30 142 views
9
Bean {
   private Boolean ok;
   public Boolean isOk(){...}
   public void setOk(Boolean ok){...}
}

Bean bean = new Bean();
String json = JSON.json(bean);

转换异常

com.alibaba.dubbo.common.bytecode.NoSuchPropertyException: Not found property "ok" filed or setter method in class com.alibaba.dubbo.common.json.JSONTest$Bean.
    at com.alibaba.dubbo.common.bytecode.Wrapper1.getPropertyValue(Wrapper1.java)
    at com.alibaba.dubbo.common.json.GenericJSONConverter.writeValue(GenericJSONConverter.java:125)
    at com.alibaba.dubbo.common.json.JSON.json(JSON.java:143)
    at com.alibaba.dubbo.common.json.JSON.json(JSON.java:94)
    at com.alibaba.dubbo.common.json.JSON.json(JSON.java:86)
    at com.alibaba.dubbo.common.json.JSON.json(JSON.java:71)
    at com.alibaba.dubbo.common.json.JSONTest.testObject2Json(JSONTest.java:97)

回答

4

你好,如果ok属性是boolean型的话,最好前面加is,has,can等,否则,Wrapper当作普通属性解析,就应该是setOk()、getOk()。所以你可以通过两种方式之一修改: 第一,声明属性是为private Boolean isOk; 第二,修改setter与getter方法,setOk()、getOk();

Good Luck!!

9

你可以看一下Wrapper的源码:

else if( ( matcher = ReflectUtils.IS_HAS_CAN_METHOD_DESC_PATTERN.matcher(md) ).matches() ) ... c1.append(" throw new " + NoSuchPropertyException.class.getName() + "(\"Not found property \"\"+$2+\"\" filed or setter method in class " + c.getName() + ".\"); }");

然后看“ReflectUtils.IS_HAS_CAN_METHOD_DESC_PATTERN”的定义:

public static final Pattern IS_HAS_CAN_METHOD_DESC_PATTERN = Pattern.compile("(?:is|has|can)([A-Z][_a-zA-Z0-9]*)()Z");

应该就能明白了

6

换种序列化方式就OK

8

:100: 嗯,这个问题早已关闭. 看来idea代码自动生成也没遵守约定,不过发现lombok生成的代码是对的:smile:

3

不会吧,我用 idea 14 field 类型是 Boolean 的时候用 generate 默认生成的 getter 是 get 开头的。

4

@Gonster 我知道了,是idea 默认的getter模板 问题

我的是这样的

#if ($field.boolean)
  #if ($StringUtil.startsWithIgnoreCase($name, 'is'))
    #set($name = $StringUtil.decapitalize($name))
  #else
    is##
#end
#else
  get##
#end

idea 后面的版本修改过 改成了

#if ($field.boolean && $field.primitive) //就是这里
  #if ($StringUtil.startsWithIgnoreCase($name, 'is'))
    #set($name = $StringUtil.decapitalize($name))
  #else
    is##
#end
#else
  get##
#end
2

噫,原来是这样???