Врезанные в калитку сообщения во фрагменте пытаются получить фрагмент из модели страницы - PullRequest
0 голосов
/ 13 декабря 2011

Я очень близко к работе, но последнее препятствие оставляет меня озадаченным.Мой вариант использования: для дискуссионной панели я должен показать сообщение 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 не сможет его найти?

1 Ответ

1 голос
/ 13 декабря 2011

ПОСТАНОВИЛИ

Поскольку подозреваемый распознаватель сообщений калитки искал ребенка с именем 'updatedBy.displayName' непосредственно в receientsPlaceHolder. Это не пойдет глубже, чем это. Либо измените идентификатор ссылки на «beginBy.displayName», либо, как я сделал, измените переменную в текстовом ресурсе на «showUser».

...