2011-10-04 7 views
3

속도로, $ object.variable을 수행 할 때 에 대한 getter 함수를 찾을 수 없거나 getter가 null을 반환하면 찾을 수 없습니다. 그냥 $ object.variable 페이지에 명시 적으로 표시됩니다속도 이벤트 핸들러

나는 조용한 참조가 있다는 것을 알고 있지만 나는 추가하고 싶지 않다! 수천 개의 변수에 서명하십시오.

나는 모두 InvalidReferenceEventHandler, NullValueHandler를 시도했다.

여기에는 특정 유형의 Eventhandler가 있습니다.

많은 감사합니다.

답변

2

나는 Engine-1.7 코드를 기반으로합니다.

유효하지 않은 메서드가 호출되면 유틸리티 메서드 EventHandlerUtil.invalidGetMethod가 호출되는 것 같습니다. 이 메서드는 새 InvalidGetMethodExecutor를 만듭니다 (InvalidReferenceEventHandler의 내부 클래스입니다). 결국 이것은 invalidReferenceHandlerCall에 대한 호출로 연결되며 결국에는 정의 된 handlerIterator를 반복합니다. 불행히도 나는 Velocity의 내부 구조에 대해 충분히 알지 못한다. 내 생각 엔 사용자 목록에서이 동작을 재정의하는 방법을 제안하거나 사용자 지정 도구를 사용/구현하는 것이 좋습니다.

편집 :

개발자 가이드에 따르면 다음을 수행 할 수 있습니다. 당신은 그것을 처리하는 코드를 작성해야하지만 너무 어렵지 않을해야합니다

플러그 반성

runtime.introspector.uberspect = org.apache.velocity.util.introspection.UberspectImpl 

이 속성은 'Uberspector'모든 성찰을 처리하는 반성 패키지를 설정 Velocity에 대한 전략. Uberspector 클래스의 쉼표로 구분 된 목록을 지정할 수 있습니다.이 경우 모든 Uberspector가 연결됩니다. 기본 체이닝 동작은 제공된 모든 uberspector 사이의 각 인트로 스펙 션 호출에 대한 첫 번째 null이 아닌 값을 반환하는 것입니다. org.apache.velocity.util.introspection.AbstractChainableUberspector를 하위 클래스 화하거나 (직접 org.apache.velocity.util.introspection.ChainableUberspector를 구현하여)이 동작을 수정할 수 있습니다 (예 : 일부 메소드에 대한 액세스를 제한). 이렇게하면 첫 번째 비공유 값을 반환하는 것이 아니라 더 많은 흥미로운 규칙 또는 패턴을 생성 할 수 있습니다.

+1

대부분의 경우 getter 자체가 유효하지만 getter가 반환하는 값은 null 일 수 있습니다.이 메서드는 유효하고 유효하지 않은 stethos는 결코 호출되지 않습니다. –

+0

기본적으로 동일한 코드가 통과됩니다 참조가 null 인 경우 (getter가 존재하지 않으면 execute를 호출하면 null이 반환됩니다. 엄격한 참조를 설정하지 않은 경우). – Scott

+0

엄격한 심판을 켜는 방법? 조용한 참조를 사용하지 않는다는 것을 의미합니까? 그러나 아직도 당신의 시간과 친절에 대해 많은 동료에게 감사드립니다. –

3

위의 내용이 유효한 선택 인 것처럼 보입니다.

public class AppSpecificInvalidReferenceEventHandler implements 
                InvalidReferenceEventHandler 
{ 

    private static final Logger LOGGER = 
    Logger.getLogger(AppSpecificInvalidReferenceEventHandler.class); 

    @Override 
    public Object invalidGetMethod(Context context, String reference, 
           Object object, String property, Info info) 
    { 
    reportInvalidReference(reference, info); 
    return ""; 
    } 

    @Override 
    public boolean invalidSetMethod(Context context, String leftreference, 
            String rightreference, Info info) 
    { 
    reportInvalidReference(leftreference, info); 
    return false; 
    } 

    @Override 
    public Object invalidMethod(Context context, String reference, Object object, 
           String method, Info info) 
    { 
    if (reference == null) { 
     reportInvalidReference(object.getClass().getName() + "." + method, info); 
    } else { 
     reportInvalidReference(reference, info); 
    } 
    return ""; 
    } 

    private void reportInvalidReference(String reference, Info info) 
    { 
    LOGGER.info("REFRERENCE: " + reference + " Info <" + info + ">"); 
    } 
} 

당신은 또한 당신의 velocity.properties 파일에 다음을 추가해야합니다 : 그러나 여기에 또 다른 옵션입니다

eventhandler.invalidreferences.class=path.to.package.AppSpecificInvalidReferenceEventHandler,org.apache.velocity.app.event.implement.ReportInvalidReferences 

은 가능성이 필요합니다, 그래서 당신은, 비록 결과에 놀랄 수도 귀하의 필요에 따라 미세 조정하십시오.

+0

여전히 작동하지 않는 스캇, 나는 대답을 찾으려고 아직도 노력하고 있습니다. –

+0

위의 코드에서 Whaat 동작을 보았습니까? 우리 애플리케이션에서 테스트 해봤는데 렌더링 된 페이지에 유효하지 않은 참조가 나타나지 않았다. 당신의 부동산이 회수되었는지 확신합니까? 예제에 로깅을 추가 하시겠습니까? – Scott