Play Framework: доступ к глобальной переменной и управление ею

В настоящее время я создаю приложение для бухгалтерского учета, теперь я хочу сохранить эту «дату окончания периода», которую можно изменить. Я считаю, что мы можем использовать глобальную переменную, однако я не знаю, как это сделать. До сих пор я пытался создать переменную в application.conf, подобную этой application.date="2014/12/15".

Более того, я не уверен, как изменить значение, используя описанный выше подход. Есть ли хороший подход к этой проблеме?


person Bla...    schedule 11.12.2014    source источник
comment
Прежде всего, application.conf содержит константы с глобальной конфигурацией приложения, а не переменные. Не могли бы вы объяснить вашу проблему более кратко?   -  person Daniel Olszewski    schedule 11.12.2014
comment
application.conf не лучшее место для хранения изменяемых значений. Он хранит конфигурации вашего приложения, в основном жестко закодированные значения, которые могут измениться перед развертыванием.   -  person Mon Calamari    schedule 11.12.2014
comment
Что ж, моя цель — найти способ сохранить дату окончания этого периода без создания какой-либо таблицы в моей базе данных. Можете ли вы предложить способ сохранить эту дату? Я прочитал несколько статей, в которых предлагается создать object Global extends GlobalSettings, но я не знаю, как получить доступ или изменить значение.   -  person Bla...    schedule 11.12.2014
comment
Если вы не хотите использовать базу данных для сохранения изменяемого значения, единственным вариантом является использование файла в файловой системе. Вы можете сохранить это в другом файле в папке resources. Например, resources\mydata   -  person Soumya Simanta    schedule 11.12.2014


Ответы (1)


arrow_upward
5
arrow_downward

Возможный способ — использовать Singeleton Object, который инициализируется в Global.scala.

Глобальный объект должен находиться в корневом каталоге scala приложения или настраиваться через application.conf.

Синглтон для общих данных

в app/shared/Shared.scala(имя свободно)

package shared

object Shared {
 private var data: Int = 0

 def setData(d: Int) : Unit = data = 0
 def getData : Int = data
}

В application.conf вы можете настроить глобальный вызов при запуске приложения (вы также можете просто поместить файл с именем Global.scala в приложение, который будет использоваться по умолчанию)

application.global= settings.Global
shared.initial = 42

In app/settings/Global.scala

object Global extends GlobalSettings {
  override def onStart(app: Application) {
   // Here I use typesafe config to get config data out of application conf
   val cfg: Config = ConfigFactory.load()
   val initialValue = cfg.getInt(shared.initial)
   // set initial value for shared
   Shared.setData(initialValue)
  }
}

В коде воспроизведения, чтобы получить или установить общие данные.

import shared.Shared

Shared.getData
Shared.setData( 8 )
person Andreas Neumann    schedule 11.12.2014
comment
Итак, каждый раз, когда я выполняю play run, он инициализирует data значением 42? Я предпочитаю устанавливать его через application.conf, но откуда берется эта переменная settings.? - person Bla...; 12.12.2014
comment
Я попробовал ваш код выше, однако получил ошибку: not found Shared value, когда я пытаюсь получить его в контроллере. - person Bla...; 12.12.2014
comment
settings — это имя пакета, в который я поместил глобальный объект. - person Andreas Neumann; 12.12.2014
comment
Чтобы использовать общий объект, вы должны импортировать его в контроллер: import package_name_you_have_chosen.Shared - person Andreas Neumann; 12.12.2014
comment
Чтобы прочитать данные из конфигурации, используйте typesafe config. Я дополню пример. - person Andreas Neumann; 12.12.2014
comment
Ах, понятно.. Спасибо, я все еще новичок здесь.. хахаха.. На этот вопрос есть много ответов, но они не такие ясные, как ваш. Надеюсь, вы сможете уточнить подробности для будущего спрашивающего. - person Bla...; 12.12.2014
comment
Эй, я попробовал ваш код выше без глобального, так как я не думаю, что это поможет. Проблема в том, что всякий раз, когда я перезапускаю свой Play, значение возвращается к значению по умолчанию. Можно ли как-то сохранить данные без использования БД? - person Bla...; 17.12.2014
comment
Да. Вы можете записать данные на диск. При запуске вы читаете с диска, а при завершении работы записываете на диск. - person Andreas Neumann; 17.12.2014
comment
Не могли бы вы уточнить, как я могу записать на диск? - person Bla...; 17.12.2014
comment
Вы можете сделать это, как и с любым другим файлом. При инициализации объекта вы читаете файл (может быть сериализован или JSON, все зависит от вас), чтобы получить значение при завершении работы, которое вы записываете в файл. Есть много способов сделать это, в зависимости от ваших потребностей, поэтому я не могу дать общее мнение. Для записи и чтения файлов с помощью Scala см., например, stackoverflow.com/questions/4604237/ - person Andreas Neumann; 17.12.2014