Вызов getString () в конструкторе в Wicket дает ошибку - PullRequest
1 голос
/ 02 февраля 2012

У меня проблемы с локализацией в калитке.

Это код:

private String displayString;
private TextField<String> myTextField;

public myPage(DomainObject domainObject){
    if(domainObject != null)
        displayString = domainObject.getDisplayString();
    myTextField = new TextField<String>("myTextField", new PropertyModel<String>(this, "displayString"));

    if(Strings.isEmpty(displayString))
        displayString = getString("mandatory"); //<- error message here

}

Проблема в том, что вызов getString в конструкторе приводит к сообщению об ошибке («... Это может иногда привести к неверному или не возвращенному локализованному ресурсу ...»). Я хочу использовать PropertyModel для TextField, поскольку не хочу переводить строку, полученную из domainObject.getDisplayString (). Я не хочу, чтобы изменения, сделанные в TextField, напрямую влияли на значение в domainObject. Можно избавиться от сообщения об ошибке, выполнив это вместо getString:

if(Strings.isEmpty(displayString))
    displayString = new ResourceModel("mandatory").getObject(); //<- no error message

Насколько я понимаю, это то же самое, что и вызов getString (вы просто удаляете предупреждения, но проблема все еще существует). Решение, о котором я подумал, таково:

@Override
protected void onAfterRender() {
    super.onAfterRender();
    if(Strings.isEmpty(displayString))
        displayString = getString("mandatory"); //<-  no error message
}

Кто-нибудь видит проблему с этим решением? Может быть, я не думаю, что достаточно "wickety"?

Ответы [ 2 ]

6 голосов
/ 02 февраля 2012

Вызов getString () требует, чтобы компонент находился внутри иерархии компонентов, где он может обращаться к своему родителю, чтобы иметь возможность вернуться к свойствам, определенным там или далее в дереве. Это невозможно внутри конструктора компонента (так как вы добавите его к родительскому элементу позже). Wicket 1.5 представляет функцию onInitialize для этих операций. В предыдущих версиях Wicket есть простой способ эмулировать это поведение:

В вашем базовом компоненте и странице определите не финальный пустой метод как

protected void onInitialize() {}

и добавьте это к методу onBeforeRender:

protected void onBeforeRender() {
...
    if (!hasBeenRendered()) {
        onInitialize();
    }
...
}

Затем вы можете использовать переопределенный метод onInitialize () в любом из ваших компонентов для работы с вещами, которые должны ждать, пока не будет установлена ​​иерархия компонентов.

2 голосов
/ 02 февраля 2012

А как насчет многоразового поведения:

public class MandatoryBehavior extends AbstractBehavior {
  public void onComponentTag(Component component, ComponentTag tag) {
    if (((AbstractTextComponent)component).isRequired() && Strings.isEmpty(tag.get("value"))) {
      tag.put("value", component.getString("mandatory"));
    }
  }
}

Вы должны проверить отправленные значения в валидаторе.

HTML5 заполнители еще лучше.

...