java - 在 Wicket 的构造函数中调用 getString() 会出错

标签 java localization wicket

我在 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
}

有人发现这个解决方案有问题吗?也许我还不够“wickety”?

最佳答案

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

在你的基础组件和页面中定义一个非最终的空方法作为

protected void onInitialize() {}

并将其添加到 onBeforeRender 方法中:

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

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

关于java - 在 Wicket 的构造函数中调用 getString() 会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9110209/

相关文章:

magento - 是否可以仅为一位用户更改 Magento 后端语言?

java - Wicket Jsp 和 web.xml

java - mybatis在插入数据库时​​是否会更改时区?

java - 托盘图标通知气球不适用于 Windows 10

java - 资源包中的值作为 formatDate 中的模式

android - 我有一个在英文版上运行的 android 应用程序现在客户希望它转换成阿拉伯语

css - 有没有办法动态更改按钮的 CSS 类?

java - Wicket session 过期

java - Glassfish 基本身份验证错误

java - gwt-maven-插件 : Plugin requires Maven version 2. 1