Как добавить к набору структур в CFPROPERTY?

Я использую <cfproperty /> для использования неявных геттеров и сеттеров в ColdFusion (Railo).

Однако как добавить к ним более сложные значения, такие как структуры и массивы?

<cfproperty name="settings" type="struct" />

Как я могу добавить элемент в свойство, называемое настройками? Если я сделаю следующее:

<cfset setSettings(structAppend(getSettings(), { "hello" = "world" })) />

Я получаю следующую ошибку:

java.lang.NullPointerException

Я что-то упустил здесь? Я новичок в теге cfproperty и думал, что это сэкономит время, но я не могу понять это.

Кроме того, в качестве бонуса, как мне установить значение по умолчанию для этих сложных типов данных?

Спасибо, Майки


person Michael Giovanni Pumo    schedule 09.05.2013    source источник


Ответы (1)


Пара вещей здесь...

<cfset setSettings(structAppend(getSettings(), { "hello" = "world" })) />

Настройки — это struct, но structAppend() возвращает логическое значение. Добавьте свою структуру перед этой строкой. Во-вторых, структуры всегда передаются по ссылке, то есть, если вы делаете getSettings(), вы получаете struct, в который вы можете вносить изменения. Другой вызов getSettings() вернет тот же struct с обновленными настройками.

Все, что вам нужно, это:

<cfset structAppend(getSettings(), { "hello" = "world" }) />

Последняя вещь. Вы можете получить исключение нулевого указателя, потому что getSettings() запускается неинициализированным. В вашем cfc в области конструктора (после ваших свойств) вы должны установить начальные настройки struct, например:

<cfset setSettings({}) />
person Nathan Strutz    schedule 09.05.2013
comment
Кажется, ваш последний пункт решил проблему. Я не знал, что мне нужно было явно установить() такой тип. Я предполагаю, что атрибут type справится с этим. Спасибо! - person Michael Giovanni Pumo; 10.05.2013
comment
Свойства объявляются, но не инициализируются. Если вы запустите геттер до его инициализации, он вернет null (и уничтожит любую переменную, которую вы пытаетесь установить), но в некоторых случаях он обрабатывается как пустая строка (len(getSomeProperty())==0). Я использую bean factory для автоматической инициализации свойств struct и array. - person imthepitts; 10.05.2013