2015-08-14 45 views
2

上沒有正確更改我使用PropertyModel類和setDefaultModelObject()方法 來編寫頁面鏈接單擊時更改標籤。 我預計將從「John Doe」更改爲「Jane Smith」。 但它更改爲[email protected]_wicket標籤在setDefaultModelObject

這是Wicket的正確行爲嗎? 還是我錯了什麼? 我正在使用Wicket 7.0.0。

ExamplePage.java

package com.mycompany.myproject; 

import org.apache.wicket.markup.html.WebPage; 
import org.apache.wicket.markup.html.basic.Label; 
import org.apache.wicket.markup.html.link.Link; 
import org.apache.wicket.model.PropertyModel; 

public class ExamplePage extends WebPage { 
    public ExamplePage() { 
     ScoreBean johnScore = new ScoreBean(); 
     johnScore.setName("John Doe"); 
     johnScore.setScore(79); 

     final ScoreBean janeScore = new ScoreBean(); 
     janeScore.setName("Jane Smith"); 
     janeScore.setScore(84); 

     final Label label = new Label("label", new PropertyModel<>(johnScore, "name")); 
     add(label); 

     Link link = new Link("link") { 
      @Override 
      public void onClick() { 
       label.setDefaultModelObject(janeScore); 
      } 
     }; 
     add(link); 
    } 
} 

ExamplePage.html

<!DOCTYPE html> 
<html lang="en" xmlns:wicket="http://wicket.apache.org"> 
<head> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
<span wicket:id="label"></span> 
<a wicket:id="link">Click me</a> 
</body> 
</html> 

ScoreBean.java

package com.mycompany.myproject; 

import java.io.Serializable; 

public class ScoreBean implements Serializable { 
    private String name; 
    private Integer score; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getScore() { 
     return score; 
    } 

    public void setScore(Integer score) { 
     this.score = score; 
    } 
} 

ExamplePageTest.java

package com.mycompany.myproject; 

import org.apache.wicket.util.tester.WicketTester; 
import org.junit.Before; 
import org.junit.Test; 

public class ExamplePageTest 
{ 
    private WicketTester tester; 

    @Before 
    public void setUp() 
    { 
     tester = new WicketTester(new WicketApplication()); 
    } 

    @Test 
    public void labelChangedCorrectly() 
    { 
     tester.startPage(ExamplePage.class); 
     tester.assertRenderedPage(ExamplePage.class); 

     tester.clickLink("link"); 
     tester.assertLabel("label", "Jane Smith"); 
    } 
} 

測試結果。

12:48:16.883 [main] INFO org.apache.wicket.Application - [WicketTesterApplication-77ef7482-95ae-4e94-b274-1e9fcfb961be] init: Wicket core library initializer 
12:48:16.887 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IBehaviorListener, method=public abstract void org.apache.wicket.behavior.IBehaviorListener.onRequest()] 
12:48:16.891 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IFormSubmitListener, method=public abstract void org.apache.wicket.markup.html.form.IFormSubmitListener.onFormSubmitted()] 
12:48:16.892 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=ILinkListener, method=public abstract void org.apache.wicket.markup.html.link.ILinkListener.onLinkClicked()] 
12:48:16.893 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IOnChangeListener, method=public abstract void org.apache.wicket.markup.html.form.IOnChangeListener.onSelectionChanged()] 
12:48:16.894 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IResourceListener, method=public abstract void org.apache.wicket.IResourceListener.onResourceRequested()] 

org.junit.ComparisonFailure: 
Expected :Jane Smith 
Actual :[email protected] 
<Click to see difference> 
    at org.junit.Assert.assertEquals(Assert.java:115) 
    at org.junit.Assert.assertEquals(Assert.java:144) 
    at org.apache.wicket.util.tester.WicketTester.assertLabel(WicketTester.java:603) 
    at com.mycompany.myproject.ExamplePageTest.labelChangedCorrectly(ExamplePageTest.java:24) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 


Process finished with exit code 255 

回答

2

該錯誤可能是在單擊處理方法:

label.setDefaultModelObject(janeScore); 

其中janeScore不是PropertyModel而是一個普通的對象。 在這種情況下,調用Object的toString方法將解釋輸出。

你必須初始化另一個PropertyModel爲janeScore,或直接設置所需的值:

label.setDefaultModelObject(janeScore.getName()); 

注意janeScore將始終與頁。如果你有一個真正的數據源(數據庫),你必須切換到LoadableDetachableModel

+0

我可能是錯的,但是,這樣做的一個方法是在'ExamplePage'中用'johnScore'設置'compoundPropertyModel',然後將其更改爲'janeScore'。 使用這種方式,他不必使用PropertyModel。只需將標籤的id,屬性的名稱放在'ScoreBean'中即可。 – GustavoCinque

相關問題