Truy cập Play! 2.0 biến cấu hình trong application.conf?


81

Trước đây trong Play! v1 thực sự dễ dàng để xác định các biến cấu hình trong application.confvà sau đó truy cập chúng như vậy:

play.configuration("db.driver")

Tuy nhiên, bây giờ tôi không thể tìm thấy bất kỳ điều gì trong tài liệu về các cách sử dụng tương tự trong v2 hoặc một giải pháp thay thế thích hợp. Phương pháp để làm như vậy là gì?


1
Đối với khách mới, câu hỏi này không giới hạn trong Play 2.0. Nhiều câu trả lời khác đã được thực hiện cho các phiên bản chơi khác bên dưới.
saurabheights

Câu trả lời:


36

Kể từ Play 2.5, play.api.Play.currentkhông được dùng nữa. Bạn nên sử dụng phương pháp tiêm phụ thuộc để đưa vào Environmenthoặc Configurationvà sử dụng nó để đọc giá trị cấu hình:

class HomeController @Inject() (configuration: play.api.Configuration) extends Controller {
  def config = Action {
    Ok(configuration.underlying.getString("db.driver"))
  }
}

Kiểm tra tài liệu Play để thảo luận chi tiết hơn.


5
Cảm ơn bạn đã cung cấp một câu trả lời cập nhật. Tôi sẽ đánh dấu đây là câu trả lời chính xác cho những người dùng Play trong tương lai! 2.x
crockpotveggies

1
Cảm ơn, điều này sẽ hoạt động tốt cho đến khi Play được thay đổi lại.
Karlth

Vì vậy, làm thế nào để làm cho điều này hoạt động trong một lớp thử nghiệm? Ví dụ: Spces2?
rapt

115

Play 2.0 Scala tương đương với điều này sẽ là:

Play.current.configuration.getString("db.driver")

Bạn cũng sẽ cần import play.api.Play

Các tài liệu đầy đủ cho điều này là ở đây .


cảm ơn rất nhiều và tôi đánh giá cao liên kết. hy vọng chúng ta thấy nhiều tài liệu hơn trong nhà Scala bên ngoài trình khám phá API :)
crockpotveggies

15
Lưu ý rằng tùy từng trường hợp, bạn không thể giả định rằng ứng dụng chưa khởi động hoặc bạn không cần ứng dụng 'cho đến phần mã này; bạn có thể sử dụngplay.api.Play.maybeApplication.map(_.configuration.getString("db.driver"))
Andy Petrella

6
Tính năng này hiện không được dùng trong Play 2.5. Xem hướng dẫn di chuyển
Breavyn

57

Áp dụng cho Play 2.0 - Trong Java Controller, bạn có thể sử dụng như sau:

String optionValue = Play.application().configuration().getString("db.driver");

Để có được biến trong chế độ xem, hãy sử dụng cái này:

@play.Play.application().configuration().getString("db.driver")

1
Làm thế nào tôi có thể sử dụng nó vào javascript?
Premraj

1
@premraj Sử dụng chia sẻ nó như một thuộc tính dữ liệu HTML5 của một div ẩn.

22

Trong Play 2.3.2 cho Java, bạn có thể sử dụng com.typesafe.config.ConfigFactorytùy chọn:

Config conf = ConfigFactory.load();
String myFooBarConfiguration = conf.getString("foo.bar");

API di chuyển nhanh chóng!


Đây là câu trả lời chính xác cho phiên bản hiện tại của Play ... không sử dụng DI.
toidiu

Giải pháp này độc lập với phiên bản Play. Nó cũng hoạt động trong Scala. Có thể phụ thuộc vào phiên bản HOCON nếu họ đã từng thay đổi điểm truy cập đó.
Patrick Sauts

6

Một phương pháp khác được thử nghiệm trong Play 2.3 [.8] / Java để truy cập các giá trị từ application.conf:

Để kiểm tra phiên bản Play, hãy kiểm tra dự án tệp / plugin. Dòng có chứa "sbt-plugin" phải có thông số phiên bản như "2.3.8".

Ví dụ: nếu application.conf chứa các dòng

myConfigStringValue=abc
myConfigBooleanValue=true

người ta có thể truy vấn các giá trị đó từ tệp / lớp java như

import play.Configuration;
...
String myString = Configuration.root().getString("myConfigStringValue");
Boolean myBoolean = Configuration.root().getBoolean("myConfigBooleanValue");

Các phương thức get ... trả về null nếu không tìm thấy giá trị, cũng có các phương thức get ... nhận giá trị mặc định làm đối số.

Để biết chi tiết, hãy xem https://www.playframework.com/documentation/2.3.x/api/java/index.html

và kiểm tra việc chơi của lớp.


5

Trong Play Scala 2.3.x và 2.4.x, để đọc giá trị từ đó conf/application.conf, bạn có thể làm như sau:

import play.api.Play.current
...
current.configuration.getString("db.driver")

4

Trong Play 2.0.1 Java, bạn cần thực hiện điều này:

import play.Application.*;
...
String optionValue = play.Play.application().configuration().getString("my.config");

3

Trong Play 2.1, Scala Đầu tiên bạn phải import play.api.Play Play.current.configuration.getString("varibale name")


3

Trong Java với play> 2.5.X, bạn có thể đọc các giá trị cấu hình thông qua trình trợ giúp ConfigFactory:

ConfigFactory.load().getString("redis.url")

hoặc là

ConfigFactory.load().getInt("redis.port")

Đối tượng Config sẽ chuyển đổi param thành đúng kiểu. Nó hiển thị các phương thức để xử lý bất kỳ loại java nào (getDouble, getLong, v.v., v.v.)

Tài liệu: https://www.playframework.com/documentation/2.5.0/api/java/play/Configuration.html


2

Trong trường hợp bạn đang sử dụng Play Scala , tôi thấy cách tiếp cận này là thích hợp nhất sau khi tìm kiếm một số phương pháp hay nhất. Để làm như vậy, tôi đã chèn cấu hình và sau đó truy cập khóa cấu hình của mình như sau:

import play.api.Configuration

class myClass @Inject()(
  config: Configuration
) {
  val configValue: String = config.underlying.getString("configKey")
}

Bằng cách này, bạn không nhận được Tùy chọn, mà là Chuỗi. Trong trường hợp không có sẵn, nó sẽ ném ra một ngoại lệ:

Error injecting constructor, com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'configKey'

Mục tiêu chính là tránh getgiải pháp thuần túy mà @peoplemerge đã đề cập trong khi ném một ngoại lệ cụ thể nếu Không có.


2

Là một đóng góp / cải tiến nhỏ cho tất cả các @Injectcâu trả lời ở đây, bạn không cần phải gọi việc config.underlyingtriển khai. Bạn có thể trực tiếp sử dụngconfig.getString

thí dụ:

@Singleton
class RESTSessionChecker @Inject()(
    implicit override val conf: Configuration)
    extends Filter {

   val MAX_CONCURRENT_REQUESTS = conf.getString("MAX_CONCURRENT_REQUESTS").
         getOrElse("100").toInt
   ...

1

Có nhiều cách để truy cập cấu hình trong Play bằng Scala

Các hoạt động sau đây trên Play 2.7.x

Tùy chọn 1: Với DI

import play.api.Configuration
.... other imports ...

class MyActor @Inject()(config: Configuration) extends Actor  {
 println(config.get[String]("akka_actor_custom_dispatcher"))
 println(config.get[String]("akka_actor_custom_dispatcher")) // w/o optional
 println(config.getOptional[Int]("value_1").getOrElse(2))    // with optional 
 .....
 }

Tùy chọn 2: w / o DI

import play.api.Configuration
.... other imports ...

class MyActor() extends Actor {
 val config = new Configuration(ConfigFactory.load("application.conf")) // application.conf is optional 
 println(config.get[String]("akka_actor_custom_dispatcher"))
 println(config.get[String]("akka_actor_custom_dispatcher")) // w/o optional
 println(config.getOptional[Int]("value_1").getOrElse(2))    // with optional 
 .....
 }

Làm thế nào để @Inject()trong một lớp thử nghiệm?
rapt

@rapt Tôi khuyên bạn nên xem qua playframework.com/documentation/2.8.x/… . Về cơ bản, bạn sẽ cần ghi đè ứng dụng Play được sử dụng trong quá trình kiểm tra. Khi bạn làm điều này, GuiceApplicationBuilderbạn sẽ có cơ hội ghi đè các ràng buộc mặc định. Ngoài ra, các thành phần Play hiện có của bạn sẽ được khởi tạo như mong đợi.
Nick Jacobs

0

Như những người khác đã đề cập, bạn cần nhập play.api.Play.current. Sau đó, nếu bạn chạy:

current.configuration.getString("db.driver")

Trên 2.3.x / scala 10, bạn sẽ nhận được

type mismatch; 
found   : Option[String]
required: String

Nếu điều này là bắt buộc, điều này sẽ hoạt động:

url = current.configuration.getString("db.driver").get

Bất cứ ai đề nghị một câu trả lời tốt hơn?


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.