Я очень близко к работе, но последнее препятствие оставляет меня озадаченным.Мой вариант использования: для дискуссионной панели я должен показать сообщение i18n в зависимости от количества участников обсуждения.Итак, у меня есть сообщения вроде:
- От $ {startBy.displayName} до $ {firstRecipients}
- От $ {startBy.displayName}$ {firstRecipients} и $ {otherRecipientsCount} others
Я решил использовать фрагменты, поскольку этот подход казался наиболее чистым, поэтому для каждого из приведенных выше сообщений у меня есть фрагмент.Для второго это:
<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>
Итак, сообщение калитки будет скомпилировано из текста + переменных встроенных компонентов (startBy.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);
}
}
Это работает как шарм.Теперь, последнее препятствие, мне нужно сделать StartBy.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);
Таким образом, вместо добавления метки (startByLabel) к фрагменту, я добавляю метку к ссылке и добавляю ссылку на фрагмент.
Теперь я получаю следующее исключение, когда панель отображается:
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)
Таким образом, по какой-то причине где-то внизу цепочки для анализа сообщения он пытается найти getRecipientsPlaceHolder в (объекте модели) DiscussionTO (см. WicketMessageResolver в stacktrace).
Похоже, что если переменная сообщения (startBy.displayName) не соответствует идентификатору дочернего элемента непосредственно под тегом wicket: message, то wicket не сможет его найти?