【发布时间】:2017-08-29 18:26:49
【问题描述】:
我正在使用一个基于 JSP 的框架(由公司员工编写;它基于/扩展 Struts2),它使用 bean 来获取表单数据。相当标准的东西。
例如,给定这个标记:
<input name="foo" type="text" />
在某些时候,框架将获得我给它的 JavaBean 实例,并在页面加载时尝试调用 bean.getFoo() 并期望它返回一个 String,然后将其设置为值输入字段。
然后,当页面保存时,它会在框架中的某处获取提交给<form> 元素的值,并调用bean.setFoo(String val) 并将该值作为参数传递。
该框架还支持基于模板动态生成可变数量的字段。一旦你通过了所有的 JSP 代码,它就会生成如下 HTML:
<input name="foo_1" type="text" />
<input name="foo_2" type="text" />
<input name="foo_3" type="text" />
自然,它会尝试调用bean.setFoo_1(String val)、bean.setFoo_2(String val)、bean.setFoo_3(String val) 等,以获取页面上尽可能多的模式实例。
可能出现的次数实际上是无限的(而且肯定足够大,以至于手动创建所有可能的实例非常无聊)。所以我正在寻找某种动态 bean 类,它允许框架调用这些 getter 和 setter 并发现,你瞧,它们实际上作为 getter/setter 公共方法存在于框架正在处理的对象实例上。大概它使用反射来确定方法是否存在。
有什么方法可以实现(或使用现有库)而不是编写类似下面的内容? :
public class MyBean {
private String foo_1;
private String foo_2;
private String foo_3;
private String foo_4;
private String foo_5;
// 30 years later ...
private String foo_2147483647;
// Eclipse -> Generate getters and setters... for all 2167483647 of the above and watch it crash OOM because I have so many fields
}
【问题讨论】:
-
我个人认为,如果您的 bean 有这么多字段,那么应用程序设计错误。哪个用户真正希望在他们的输入屏幕上看到这么多字段?但是,不,我没有适合您的现有框架。也许必须自己动手,但首先我会自己质疑这些课程的设计。
-
除非他们选择添加那么多字段,否则用户不会同时在屏幕上看到那么多字段。典型的例子是一个可编辑的“表格”,您可以在其中添加新行,并在每列的文本字段中输入值。问题是我无法预期用户合理期望的最大数量。在实践中,它可能会在 100 左右,但同样,只有在用户开始创建那么多时才会显示它们。它实际上是从一张空桌子开始的。在我的 bean 中创建 foo_100 仍然很丑。
-
但是你没有豆子。如果字段的数量是可变的,则可以使用可变的东西,例如 ArrayList。不要尝试为每个可能的字段输入实现一个具有一个字段的类。这太疯狂了。
-
这就是问题所在:框架似乎无法识别使用
List<String>或String[]的 bean 数据类型。它尝试将 bean 值强制转换为String并引发异常,但是由于 throwException 方法将其转换为 RuntimeException 或其他东西,因此到违规调用的实际站点的堆栈跟踪丢失了。所以我不知道它在哪里做那个演员。 ;x
标签: java jsp struts2 javabeans