我使用动态Dataset
模型,其中(简而言之)接受属性并将其存储在Map
中,就像这样......
Dataset dataset = new Dataset();
dataset.setAttribute("name", "value");
...以便以后恢复,就像这样...
String value = dataset.getAttribute("name");
......这对我的目的来说非常有用。但现在我在一个我想使用模板引擎来动态生成HTML的地方。在模板中,我做了很多${dataset.getAttribute("name")}
并不理想。如果我可以在Dataset
添加某些内容时创建人工方法,那将是相当不错的。例如,如果我这样做......
dataset.setAttribute("name", "value");
...我希望能够像这样检索它......
String name;
name = dataset.name;
//or
name = dataset.getName();
...但到目前为止我还没能把它拉下来。我可以采取什么方法?它甚至可行吗?
修改:
我知道Velocity提供Property Lookup Rules尝试解析dataset.name
到dataset.get("name")
,这很好,但我需要知道如何在Velocity 的情况下实现这一点也不是目标。
答案 0 :(得分:1)
请参阅http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html#propertylookuprules
如果您的方法名为get(String attribute)
而不是getAttribute(String attribute)
,则可以使用与常规属性相同的语法。因此,要么重构您的课程,要么添加与get
完全相同的其他getAttribute
方法,或将您的对象转换为Map
,其中get
方法
答案 1 :(得分:0)
您可以将Dynamic Spring代理与AOP技术或CGLib代理一起使用。 AOP可用于描述这样的getter:execution(public * com.bla.YourClass.get*())")
答案 2 :(得分:0)
过去我用Objectweb的ASM动态生成了POJO。这样做的好处是,基础字段类型安全且效率更高(尤其是私有值)
答案 3 :(得分:0)
从我看到的情况来看,Java的模板引擎支持
是相当普遍的getAttribute
和在您花费太多时间寻找更通用的解决方案之前(假设上面的内容不会像在Velocity中那样受到支持),可能值得看看其他引擎,看看是否有任何一个没有支持它。如果所有可能的目标都有,那么你可能很好地依赖它。
在您花时间解决问题之前,我非常喜欢确保您确实遇到问题。