【问题标题】:Java BeanGenerator property name problem with open parenthesis '('带有左括号'('的Java BeanGenerator属性名称问题
【发布时间】:2021-12-16 20:27:20
【问题描述】:

我创建了一个BeanGenerator 对象和addProperties 像这样。

final BeanGenerator beanGenerator = new BeanGenerator();
final Map<String, Class<?>> properties = new HashMap<>();
properties.put("name", String.class);
properties.put("`name", String.class);
properties.put("~name", String.class);
properties.put("!name", String.class);
properties.put("@name", String.class);
properties.put(")name", String.class);
properties.put("(name", String.class); // Problem !!!
BeanGenerator.addProperties(beanGenerator, properties);

即使我使用`~!@#$%^&amp;*)-+= 等非正式字符作为属性名称,它也可以正常运行。

但是当我使用左括号 ( 作为属性名称时

java.lang.IllegalArgumentException: Name 'get(name' is invalid

发生了。

为什么?以及属性名称如何包含(

【问题讨论】:

  • 快速搜索告诉我在各种库中有一堆名为BeanGenerator 的类。这是哪一个?
  • 看起来像cglib
  • @FedericoklezCulloca org.springframework.cglib.beans.BeanGenerator
  • dang 这太旧了!!(spring-version??) spring current package description 说:“Spring 对 CGLIB 核心包的重新打包(仅供内部使用)"

标签: java cglib


【解决方案1】:

为什么?

错误信息来自:Signature constructor

它的文档记录很差,显然是“工作中”(TO-DO),但也是唯一适用的“验证规则”。: “属性键不能包含( 字符。”


属性名如何包含(?

不使用 cglib /-out forking it(/contributing to the project;)!

但即便如此,我们也会遇到(下一个)麻烦......https://docs.oracle.com/javase/specs/jls/se17/html/jls-3.html#jls-3.8

【讨论】:

  • 在我看来,他们的密钥应该用Java#Identifiers-Spec 确认(cglib 只在getset ..to 这些前面添加)
  • 键名是来自 Sql Stored Procedure 的动态自动生成的列。所以我必须通过 BeanGenerator 创建动态 POJO。我希望我可以更改名称,但我不允许。
  • 如果你不能改变格式:转换它! (使用脚本/正则表达式/作业/.../“大锤”)
猜你喜欢
  • 2015-08-13
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2018-06-16
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多