0

我非常接近工作,但最后的障碍让我感到困惑。我的用例:对于一个讨论小组,我必须根据讨论中的参与者数量显示一条 i18n 消息。所以,我有这样的消息:

  • 从 ${startedBy.displayName} 到 ${firstRecipients}
  • 从 ${startedBy.displayName} 到 ${firstRecipients} 和 ${otherRecipientsCount} 其他人

我选择使用片段,因为这似乎是最干净的方法,因此对于上述每条消息,我都有一个片段。对于第二个,这是:

<wicket:fragment wicket:id="recipients_1toMany">
    <wicket:message key="heartbeat.wall.discussion.recipients.1toMany">
    <span wicket:id="startedBy.displayName"></span>
        <span wicket:id="firstRecipients"></span>
        <span wicket:id="otherRecipientsCount"></span>
    </wicket:message>
</wicket:fragment>

因此,检票口消息将由文本 + 嵌入式组件的变量(startedBy.displayName,...)编译而成。此片段将添加到以下范围:

<span wicket:id="recipientsPlaceHolder"></span>

相关的java代码:

public class DiscussionPanel extends Panel {

    public DiscussionPanel(final String id, final DiscussionTO discussion) {
        super(id, new CompoundPropertyModel<DiscussionTO>(discussion));

        ...

        final List<DiscussionParticipantTO> list = discussion.getParticipants();

        String fragmentId = "recipients_1toMany"; //actually depends on list.size()

        Fragment fragment = new Fragment("recipientsPlaceHolder", fragmentId, this);
        Label startedByLabel = new Label("startedBy.displayName");
        fragment.add(startedByLabel);
        this.add(fragment);

    }
}

这就像一个魅力。现在,最后一个障碍,我需要将startedBy.displayName渲染为链接。

html更改:

<a href="#" wicket:id="showUser">
    <span wicket:id="startedBy.displayName"></span>
</a>

代码更改:

    ExternalLink showUserLink = new ExternalLink("showUser", "someurl");
    showUserLink.add(startedByLabel);
    fragment.add(showUserLink);

因此,我没有将标签 (startedByLabel) 添加到片段,而是将标签添加到链接并将链接添加到片段。

现在,当面板被渲染时,我得到以下异常:

Root cause:

org.apache.wicket.WicketRuntimeException: No get method defined for class: class com....DiscussionTO expression: recipientsPlaceHolder
     at org.apache.wicket.util.lang.PropertyResolver.getGetAndSetter(PropertyResolver.java:499)
     at org.apache.wicket.util.lang.PropertyResolver.getObjectAndGetSetter(PropertyResolver.java:341)
     at org.apache.wicket.util.lang.PropertyResolver.getObjectAndGetSetter(PropertyResolver.java:244)
     at org.apache.wicket.util.lang.PropertyResolver.getValue(PropertyResolver.java:97)
     at org.apache.wicket.model.AbstractPropertyModel.getObject(AbstractPropertyModel.java:134)
     at org.apache.wicket.Component.getDefaultModelObject(Component.java:1639)
     at org.apache.wicket.markup.resolver.WicketMessageResolver$MessageContainer$1.getValue(WicketMessageResolver.java:266)
     at org.apache.wicket.util.string.interpolator.VariableInterpolator.toString(VariableInterpolator.java:140)
     at org.apache.wicket.markup.resolver.WicketMessageResolver$MessageContainer.renderMessage(WicketMessageResolver.java:249)
     at org.apache.wicket.markup.resolver.WicketMessageResolver$MessageContainer.onComponentTagBody(WicketMessageResolver.java:208)
     at org.apache.wicket.markup.html.panel.DefaultMarkupSourcingStrategy.onComponentTagBody(DefaultMarkupSourcingStrategy.java:72)

因此,出于某种原因,在解析消息的链条下游某处,它试图在(模型对象) DiscussionTO 上找到一个 getRecipientsPlaceHolder(参见堆栈跟踪中的 WicketMessageResolver)。

似乎如果消息的变量(startedBy.displayName)与 wicket:message 标记下的孩子的 id 不对应,那么 wicket 无法找到它?

4

1 回答 1

1

解决

由于怀疑检票口消息解析器正在寻找一个名为'startedBy.displayName'的孩子,直接在recipientsPlaceHolder中。它不会比这更深。将链接的 id 更改为“startedBy.displayName”,或者像我一样将文本资源中的变量更改为“showUser”。

于 2011-12-13T16:20:51.483 回答