[英]Calling Java class's method from javascript in a freemarker template
[英]Freemarker prevent Template from using setter Method
我開始使用Freemarker生成電子郵件。 問題是,Freemarker允許調用java方法,這很好,但是另一方面,我不想允許用戶更改數據。
((showSubjects)) Titel: ${ MainSubject.ProductTitle} ${MainSubject.setTitle("Hallo World!")}
此代碼更改標題!
您有什么避免的想法嗎?
如果你想隱藏的所有方法,你應該設置exposureLevel
的的ObjectWrapper
到EXPOSE_PROPERTIES_ONLY
(見BeansWrapper.setExposureLevel )。 然后,您仍然可以編寫foo.bar
,它將在內部調用foo.getBar()
。 由於FreeMarker不支持分配JavaBean屬性,並且setter方法本身也不公開,因為它是一個方法,因此模板將無法更改公開的屬性。
根據rjy7-康奈爾大學的說法,可以通過防止使用setter(以“ set”開頭或返回void的方法)來設置ReadOnlyBeansWrapper來完成此解決方案。
@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);
}
}
}
我用了,它對我來說很好用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.