2017-12-15 16 views
0

私はFreemarkerを使って電子メールを生成しています。 問題はFreemarkerがJavaメソッドを呼び出すことができることですが、もう片方では、ユーザーがデータを変更できるようにしたくありません。Freemarkerはテンプレートがsetter Mehtodを使用するのを防ぐ

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

このコードはタイトルを変更します。

これを避けることをお勧めしますか?

+3

[Freemarker - 豆にのみゲッターを使用する](https://stackoverflow.com/questions/39747696/freemarker-only-use-getter-for-beans) – vinS

+0

の可能な複製@vinSご意見ありがとうございます。 私はこの質問が私の問題を解決するとは思わない。 のhierは、メソッドsetMethodShadowsPropertyのdiscriptionです: 'あなたは を持っている場合*プロパティとmyObject.foo * テンプレートでは、その後、「FOO」と呼ばれる方法の両方が方法代わりに自身 *を返しますので、プロパティ値。これはしばしば望ましくありません。「 –

+0

あなたの質問に対する答えが見つかったら(よくできました!)、あなた自身の答えを作る方が適切です。他の答えも読んで見るのが簡単です。 – Yunnosch

答えて

0

rjy7 - Cornell Universityによれば、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); 
     } 
    } 
} 

私はそれを使用して、それは私のためにうまく動作します!

0

すべてのメソッドを非表示にする場合は、ObjectWrapperexposureLevelEXPOSE_PROPERTIES_ONLYに設定する必要があります(BeansWrapper.setExposureLevelを参照)。それでは、foo.barと書くことができます。内部的にはfoo.getBar()となります。 JavaBeanプロパティへの代入はFreeMarkerではサポートされておらず、setterメソッド自体はメソッドであるため公開されないため、テンプレートは公開プロパティを変更できません。

関連する問題