2017-12-15 24 views
0

Freemarker를 사용하여 전자 메일을 생성하기 시작합니다. 문제는 Freemarker가 java 메소드를 호출 할 수 있다는 것입니다.하지만 다른 쪽에서는 사용자가 데이터를 변경할 수 없도록하고 싶습니다.Freemarker 템플릿이 setter Mehtod를 사용하지 못하도록

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

이 코드는 제목을 변경합니다.

이를 피하는 것이 좋습니다.

+3

[Freemarker - bean 용 getter 만 사용 가능합니다.] (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

모든 방법을 숨기려면 ObjectWrapperEXPOSE_PROPERTIES_ONLY (BeansWrapper.setExposureLevel 참조)으로 설정해야합니다. 그런 다음 foo.bar으로 쓸 수 있으며 내부적으로 foo.getBar()이라고합니다. JavaBean 속성에 대한 할당은 FreeMarker에서 지원되지 않으므로 setter 메서드 자체가 메서드이기 때문에 노출되지 않으므로 템플릿은 노출 된 속성을 변경할 수 없습니다.