2010-01-13 43 views
35

Tôi có một ứng dụng Groovy và tôi muốn truy cập theo chương trình đến một thuộc tính được định nghĩa trong message.properties.groovy: Cách truy cập tệp thuộc tính?

Là một thử nghiệm tôi đã thử như sau:

println "capacity.created " + ${message.properties['capacity.created']} 

Nhưng nó không hoạt động (ném một ngoại lệ).

Bất kỳ trợ giúp được chào đón

Luis

Trả lời

8

Tôi tìm thấy một cách để truy cập vào các thuộc tính thông điệp trực tiếp wothout đọc lại tất cả các thông điệp thuộc tính file (message_de.properties, message_fr.properties vv) Nó là rất dễ dàng.

message(code:"capacity.created") 

và nó hoạt động!

Luis

+0

Tôi có một lớp riêng biệt nó không phải là một bộ điều khiển, tôi đã thử điều này và nó không hoạt động ... bất cứ đề nghị nào? –

+0

@ CPU100 tiêm' messageSource' vào lớp đó và sử dụng ' Phương thức getMessage' –

+0

Điều này làm việc cho tôi nơi tôi phải chuyển một giá trị động cho Tiêu đề: Xplora

68

Đối với đọc file tài sản trong Groovy bạn có thể sử dụng lớp tiện ích ConfigSlurper và truy cập vào các thuộc tính chứa sử dụng biểu thức GPath. Tuy nhiên, bạn phải lưu ý rằng ConfigSlurper không hỗ trợ các tệp thuộc tính Java chuẩn. Thông thường, ConfigSlurper sẽ được sử dụng để đọc các tệp .groovy có thể tương tự như tệp thuộc tính, nhưng tuân thủ ký hiệu groovy chuẩn, do đó, các chuỗi bên trong dấu ngoặc kép và các chú thích bắt đầu bằng // hoặc nằm trong khối /* */. Vì vậy, để đọc một tập tin thuộc tính Java bạn cần tạo một đối tượng java.util.Properties và sử dụng để tạo ra một ConfigSlurper:

def props = new Properties() 
new File("message.properties").withInputStream { 
    stream -> props.load(stream) 
} 
// accessing the property from Properties object using Groovy's map notation 
println "capacity.created=" + props["capacity.created"] 

def config = new ConfigSlurper().parse(props) 
// accessing the property from ConfigSlurper object using GPath expression 
println "capacity.created=" + config.capacity.created 

Nếu bạn chỉ sử dụng các tập tin tài sản từ bên trong mã Groovy bạn nên sử dụng các biến thể ký hiệu Groovy trực tiếp.

def config = new ConfigSlurper().parse(new File("message.groovy").toURL()) 

Điều này cũng mang lại cho bạn một số lợi thế tốt đẹp so với tệp thuộc tính chuẩn, ví dụ: thay vì

capacity.created="x" 
capacity.modified="y" 

bạn có thể viết

capacity { 
    created="x" 
    modified="y" 
} 
+0

Cảm ơn câu trả lời của bạn. Những gì bạn đã làm là hợp lệ đối với bất kỳ tệp thuộc tính nào nhưng thông báo là tệp i18n. Tôi không nghĩ rằng điều này sẽ hoạt động nếu ngôn ngữ của khách hàng được đặt sang ngôn ngữ khác. Tôi có nghĩa là, bạn không đọc message_de, message_es, message_fr, vv Bên cạnh đó tất cả các tin nhắn đã được đọc bởi hệ thống. Tôi sẽ không đọc lại nếu tôi có thể tránh được điều đó. – Luixv

+0

Câu trả lời hay. Cảm ơn – Gervase

+4

Chỉ cần một thông báo để tải từ classpath sử dụng 'properties.load (getClass(). GetClassLoader(). GetResourceAsStream (" message.các thuộc tính "))' – banterCZ

2

Không tốt nhất là đọc message.properties cho i18n. Bạn có thể sử dụng:

message(code:"capacity.created") 

trong bộ điều khiển như @Luixv gợi ý hoặc

messageSource.getMessage("capacity.created", 
         [].toArray(), "Capacity Created.", null) 

trong bất kỳ mùa xuân khác/Grails đậu sau khi tiêm đậu messageSource.

Các vấn đề liên quan