簡體   English   中英

Freemarker阻止模板使用setter方法

[英]Freemarker prevent Template from using setter Method

我開始使用Freemarker生成電子郵件。 問題是,Freemarker允許調用java方法,這很好,但是另一方面,我不想允許用戶更改數據。

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

此代碼更改標題!

您有什么避免的想法嗎?

如果你想隱藏的所有方法,你應該設置exposureLevel的的ObjectWrapperEXPOSE_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM