Freemarker阻止模板使用setter方法

时间:2017-12-15 10:11:34

标签: java freemarker

我开始使用Freemarker生成电子邮件。 问题是,Freemarker允许调用java方法,这很好,但在另一方面,我不想让用户更改数据。

((showSubjects)) Titel: ${ MainSubject.ProductTitle} ${MainSubject.setTitle("Hallo World!")}

此代码更改标题!

你有什么想法可以避免吗?

2 个答案:

答案 0 :(得分:0)

如果要隐藏所有方法,则应将exposureLevel的{​​{1}}设置为ObjectWrapper(请参阅BeansWrapper.setExposureLevel)。然后你仍然可以写EXPOSE_PROPERTIES_ONLY,它会在内部调用foo.bar。由于FreeMarker不支持对JavaBean属性的赋值,并且因为它是一种方法而没有公开setter方法本身,所以模板无法更改公开的属性。

答案 1 :(得分:0)

根据rjy7 - Cornell University,可以通过设置ReadOnlyBeansWrapper来阻止使用setter(一个以" set"开头的方法,或者返回void的方法)来完成解决方案。

@Override
protected void finetuneMethodAppearance(Class cls, Method method, MethodAppearanceDecision decision) {

// How to define a setter? This is a weak approximation: a method whose name
// starts with "set" or returns void.
if ( method.getName().startsWith("set") ) {
    decision.setExposeMethodAs(null);

} else if ( method.getReturnType().getName().equals("void") ) {
    decision.setExposeMethodAs(null);

} else {

    Class<?> declaringClass = method.getDeclaringClass();
    if (declaringClass.equals(java.lang.Object.class)) {
        decision.setExposeMethodAs(null);

    } else {
        Package pkg = declaringClass.getPackage();
        if (pkg.getName().equals("java.util")) {
            decision.setExposeMethodAs(null);
        }
    }
}

我用它,它对我来说很好用!