2015-01-11 5 views
0

모델을로드하는 동안 오류가 발생하면 사용자에게이를 표시하는 올바른 방법은 무엇입니까? 이 페이지에 피드백 구성 요소를 추가하고이 작업을 수행하는 올바른 방법입니다) (오류를 사용하는 것 같아,하지만 난 그렇게 할 때이 오류가 얻을 :LoadableDetachableModel에서 오류보고가 작동하지 않습니다.

: 여기
Caused by: org.apache.wicket.WicketRuntimeException: Cannot modify component hierarchy after render phase has started (page version cant change then anymore) 
    at org.apache.wicket.Component.checkHierarchyChange(Component.java:3572) 
    at org.apache.wicket.Component.addStateChange(Component.java:3501) 
    at org.apache.wicket.Component.error(Component.java:1254) 
    at com.prosc.wicket.LoadableDetachableModelErrorTest$1.load(LoadableDetachableModelErrorTest.java:21) 
    at com.prosc.wicket.LoadableDetachableModelErrorTest$1.load(LoadableDetachableModelErrorTest.java:17) 
    at org.apache.wicket.model.LoadableDetachableModel.getObject(LoadableDetachableModel.java:121) 
    at org.apache.wicket.Component.getDefaultModelObject(Component.java:1605) 

내 자바 코드를

<html> 
<body> 
<div wicket:id="feedback" /> 
<div wicket:id="dynamicText" /> 
</body> 
</html> 

예상되는 결과가 사용자에게 표시되는 오류 메시지와 함께 빈 페이지를 볼 수 있습니다 :

package com.prosc.wicket; 

import org.apache.wicket.markup.html.WebPage; 
import org.apache.wicket.markup.html.basic.Label; 
import org.apache.wicket.markup.html.panel.FeedbackPanel; 
import org.apache.wicket.model.LoadableDetachableModel; 

public class LoadableDetachableModelErrorTest extends WebPage { 
    public LoadableDetachableModelErrorTest() { 
     add(new FeedbackPanel("feedback")); 
     add(new Label("dynamicText", new LoadableDetachableModel<String>() { 
      @Override 
      protected String load() { 
       String result = "Hello World"; 
       error("Uh oh, some imaginary problem happened"); 
       return result; 
      } 
     })); 
    } 
} 

여기 내 HTML 마크 업입니다.

답변

0

'가장 좋은'방법은 무엇인지 모르겠지만 Session에서 오류를 설정할 수 있습니다. 그러나 당신은 여전히 ​​... 당신이 당신의 모델을 사용하여 구성 요소에 표시 할 것을 생각해야합니다

public class LoadableDetachableModelErrorTest extends WebPage { 
    public LoadableDetachableModelErrorTest() { 
     add(new FeedbackPanel("feedback")); 
     add(new Label("dynamicText", new LoadableDetachableModel<String>() { 
      @Override 
      protected String load() { 


       if (failure) { 
        Session.get().error("Uh oh, some imaginary problem happened"); 
        return null; 
       } 
       else 
        return result; 
      } 
     })); 
    } 
} 
또한 (전체 정보를 여기에서 보는 멋진 입력 된 Exception을 던져 사용자 정의 RequestCycle에서 처리 할 수 ​​

: http://wicketinaction.com/2008/09/building-a-smart-entitymodel/는)

public class MyRequestCycle extends WebRequestCycle 
{ 
    @Override 
    public Page onRuntimeException(Page page, RuntimeException e) 
    { 
    if (e instanceof EntityNotFoundException) 
    { 
     return new EntityNotFoundErrorPage((EntityNotFoundException)e); 
    } 
    else 
    { 
     return super.onRuntimeException(page, e); 
    } 
    } 
} 
+1

세션 # error()는 방법입니다. Wicket 1.4 (또는 그 이상) 코드 예제를 사용하지 않았다면 답을 +1합니다. 이것이 Wicket 6.x이므로 IRequestCycleListener # onException()을 사용하십시오. –

+0

error()에서 Session.get(). error()로 변경하면 실제로 "구성 요소 계층 구조를 수정할 수 없습니다."예외가 발생하지 않지만 내 FeedbackPanel에는 표시되지 않습니다. 모델을로드하지 못한 페이지에 세션 오류 메시지를 표시하려면 어떻게합니까? –

+0

세션, get.error()가 내 피드백 구성 요소에 표시되지 않는 이유에 대한 아이디어가 있습니까? –

0

개찰구 구성 요소를 렌더링 시작 는, 그들은 더 이상 자신의 상태를 변경할 수 없습니다.

구성 요소의 #onConfigure()에서 오류를 확인해야합니다.