我非常接近工作,但最后的障碍让我感到困惑。我的用例:对于一个讨论小组,我必须根据讨论中的参与者数量显示一条 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 无法找到它?