我开始使用Freemarker生成电子邮件。 问题是,Freemarker允许调用java方法,这很好,但在另一方面,我不想让用户更改数据。
((showSubjects)) Titel: ${ MainSubject.ProductTitle} ${MainSubject.setTitle("Hallo World!")}
此代码更改标题!
你有什么想法可以避免吗?
答案 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);
}
}
}
我用它,它对我来说很好用!