gpt4 book ai didi

java - 从模板直接访问 JavaBean 字段与 getter

转载 作者:太空宇宙 更新时间:2023-11-04 11:01:42 25 4
gpt4 key购买 nike

本周,我正在调试一些使用 JasperReport v5.5 完成的模板。在与一个奇怪的 bug 斗争了相当长的时间之后,我认为在(至少)某些情况下,对 bean 字段的访问是使用直接访问而不是调用适当的 getter 来完成的(您编写 $F{toto} ,它访问私有(private)字段 toto 而不是调用 getToto())。

模板以这种方式定义字段:

...
<field name="someValue" class="java.lang.String">
<fieldDescription><![CDATA[someValue]]></fieldDescription>
</field>
...

java bean 类是一个具有 BaseClass -> ConcretClass 的层次结构。它定义了一个标准属性 someValue,带有 getter 和 setter。 ConcretClass 重写此属性来实现一些业务逻辑(我知道这可以称为反模式,但这不是这里的重点 - 我不希望遗留代码也没有时间重构)。

所以java有这个:

public class BaseClass {
private String someValue;

public String getSomeValue() { return someValue; }
public void setSomeValue(String someValue) { this.someValue = someValue; }
}

public class ConcretClass extends BaseClass {
private String someValue;

@Override public String getSomeValue() {
LOG.info("invoking getter");
// more business logic here
return someValue;
}
@Override public void setSomeValue(String someValue) { this.someValue = someValue; }
}

它被简化了,但仍然包含了这个想法。

文档指出这些字段是使用 getter 访问的: https://community.jaspersoft.com/documentation/tibco-jaspersoft-studio-user-guide/v60/registration-javabean-fields

Jaspersoft Studio 将诸如 address.state(两个属性之间有句点字符)之类的描述解析为属性路径。该属性路径被传递给函数 getAddress() 以定位目标属性,然后传递给 getState() 以查询属性的状态。

使用 ConcretClass 实例运行我的代码永远不会显示“调用 getter”日志。相反,它显示 BaseClass#someValue 的值(此时为 null)。我已经为此浪费了至少一天的时间......

我错过了什么?这是一个错误吗?

最佳答案

好的,正如评论中提到的,@AlexK 为我指明了正确的方向。有问题的开发人员不在 Jasper 的团队中,而是在我的团队中。有一天,有人认为(几乎)在任何地方使用反射是一个好主意,他所做的一个地方就是我们自定义 JRDataSource 的 public Object getFieldValue(JRField jrField) throws JRException 的实现。

显然这是一个坏主意(处理反射时几乎总是这样)...

道德:在您的流程中添加代码审查:)

关于java - 从模板直接访问 JavaBean 字段与 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46829326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com