Ссылаться на одно свойство из другого?

В Wicket возможно ли, чтобы значение одного свойства ссылалось на другое свойство? Например, если у меня есть такое свойство, как <entry key="site.name">My Site</entry>, есть ли способ для другого свойства использовать значение site.name в своем значении?

Я пытался использовать что-то вроде <entry key="page.title">About ${site.name}</entry>, но Wicket выдает исключение, потому что пытается разрешить site.name как свойство модели... что имеет смысл. Но существует ли другой синтаксис, который позволил бы одному свойству ссылаться на значение другого?

Кстати, я использую Wicket 6.6.


person spaaarky21    schedule 22.05.2013    source источник
comment
Вы видели страницу интернационализации Wicket? cwiki.apache.org/WICKET/   -  person drobson    schedule 22.05.2013
comment
Да. У вас есть что-то более конкретное, чтобы указать? Ближайший пример, который я вижу на странице i18n, касается свойств, которые будут применяться к компоненту с вложенными компонентами (которые, в свою очередь, могут использовать свои собственные свойства). Чего я не вижу, так это примера, когда одно свойство напрямую ссылается на другое, то есть о чем мой вопрос. Я предполагаю, что это невозможно, но Wicket иногда удивляет вас неясными, плохо документированными функциями. Я просто что-то пропустил на странице, на которую вы ссылаетесь?   -  person spaaarky21    schedule 23.05.2013
comment
Вы пытались вместо этого использовать файл свойств? Я никогда не использовал ключи входа лично, но в такой ситуации я бы использовал файл свойств. Файлы свойств позволяют ссылаться на другие определенные свойства при создании нового свойства.   -  person drobson    schedule 24.05.2013
comment
Я пытался просто ради этого, но это тоже не сработало. XML и .properties — это всего лишь два разных формата, которые экземпляр java.util.Properties может анализировать для заполнения своих пар ключ-значение. Но то, как эти пары были загружены, не влияет на то, будут ли они выполнять какую-либо замену постфактум. Это не будет.   -  person spaaarky21    schedule 26.05.2013


Ответы (3)


Чтобы ответить на мой собственный вопрос, быстрый взгляд на код показывает, что Wicket загружает свойства, используя java.util.Properties, который просто анализирует поток на наличие пар ключ-значение. Он не выполняет расширения/замены свойств так, как могли бы ожидать разработчики, основываясь на своем опыте работы с такими инструментами, как ANT.

Существуют альтернативы Properties, такие как Конфигурация Apache Commons, которые выполняют расширение, а Properties нет. . Поэтому и Wicket не работает — он просто подгружает свойства по мере их написания. Единственная подстановка, которую делает Wicket, — это свойства модели при отображении страницы, а не свойства в смысле слова «файл свойств».

person spaaarky21    schedule 25.05.2013

Взгляните на StringResourceModel в Wicket.

Пример в документе: label.greetings=Welcome, ${name}! и new Label("greetings", new StringResourceModel("label.greetings", this, new Model(user)));

person mrak    schedule 24.05.2013
comment
Да, это позволяет замену, но это не по теме вопроса. Вы можете использовать StringResourceModel для разрешения одного свойства и замены значения другого. Однако это решение потребует, чтобы вы сделали это на Java, и не подходит для случаев, когда на свойство ссылаются непосредственно в разметке, используя элемент или атрибут wicket:message. Вопрос в том, чтобы сделать замену более статично, в самом файле свойств. - person spaaarky21; 24.05.2013
comment
Извините, я неправильно понял ваш вопрос. Я могу придумать решение только для особого случая, например, для упомянутого тега wicket:message. В этом случае вы можете реализовать свой собственный IComponentResolver, вот пример: pastebin.com/XazVtF1p - person mrak; 25.05.2013
comment
Как вы упомянули, это решение будет работать только в тех случаях, когда вы можете использовать новый настраиваемый тег, который обрабатывается. Это не будет работать для свойств, на которые есть ссылки где-либо еще (например, элементы wicket:message, теги wicket:message или StringResourceModels). Но я должен сказать, что это отличное решение для того, чем оно является. :) Спасибо за публикацию. - person spaaarky21; 26.05.2013

Вы можете написать свою собственную ResourceModel, которая заменит ключи: http://pastebin.com/38WB2XDF

ReplacingResourceModel будет доступен/доступен в:

<dependency>
    <groupId>org.wicketstuff</groupId>
    <artifactId>wicketstuff-minis</artifactId>
    <version>7.0.0-M6</version>
</dependency>

а также

<dependency>
    <groupId>org.wicketstuff</groupId>
    <artifactId>wicketstuff-minis</artifactId>
    <version>6.20.0</version>
</dependency>
person klopfdreh    schedule 21.02.2015