在Wicket中的构造函数中调用getString()会产生错误

时间:2012-02-02 09:52:11

标签: java localization wicket

我在检票口的本地化方面遇到了一些问题。

这是代码:

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会导致错误消息(“...这有时会导致无效或没有返回本地化资源......”)。 我想为TextField使用PropertyModel,因为我不想翻译我从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
}

是否有人发现此解决方案存在问题?也许我不是在想“摇摇晃晃”?

2 个答案:

答案 0 :(得分:6)

调用getString()要求组件位于组件层次结构中,在组件层次结构中,组件可以访问它的父级,以便有机会回退到那里定义的属性或树中的更多属性。这在组件的构造函数中是不可能的(因为稍后将它添加到它的父级)。 Wicket 1.5为这些操作引入了onInitialize函数。在此之前使用Wicket版本,有一种简单的方法可以模拟这种行为:

在基本组件和页面中将非最终的空方法定义为

protected void onInitialize() {}

并将其添加到onBeforeRender方法:

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

然后,您可以在任何组件中使用重写的onInitialize()方法来处理必须等到组件层次结构建立的内容。

答案 1 :(得分:2)

可重用行为怎么样:

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占位符更加出色。