Wicket 标签在 setDefaultModelObject 上没有正确更改

Wicket label doesn't change correctly on setDefaultModelObject

我使用PropertyModelclass和setDefaultModelObject()方法 编写一个页面,在单击页面 link 时更改标签。 我希望从“John Doe”更改为“Jane Smith”。 但是它变成了 com.mycompany.myproject.ScoreBean@31f9b85e_.

这是 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   :com.mycompany.myproject.ScoreBean@31f9b85e
 <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.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.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access[=14=]0(ParentRunner.java:58)
    at org.junit.runners.ParentRunner.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

错误可能出在点击处理方法中:

label.setDefaultModelObject(janeScore);

其中 janeScore 不是 PropertyModel 而是常规对象。 在这种情况下,对象上的 toString 方法被调用,它解释了输出。

您必须为 janeScore 初始化另一个 PropertyModel 或直接设置所需的值:

label.setDefaultModelObject(janeScore.getName());

请注意 janeScore 与页面保持一致。如果你有一个真正的数据源(数据库),你必须切换到LoadableDetachableModel