2013-04-02 11 views
5

Sự cố của tôi trông đơn giản nhưng tôi không thể giải quyết vấn đề. Tôi có một tập tin thuộc tính có chứa các chi tiết cấu hình của tất cả các môi trường (dev, qa, prod).Phần giữ chỗ thuộc tính mùa xuân với chuỗi ghép nối

Ví dụ config.properties:

dev.maxLength=2000 
qa.maxLength=4000 

Chúng tôi có một tập tin thuộc tính mẹ mà giữ tên máy chủ, ánh xạ môi trường.

Ví dụ hosts.properties:

host1=dev 
host2=qa 

Tên thuộc tính host1 được lưu trữ trong một bean hostname.

<bean id="hostname" 
    factory-bean="localhostInetAddress" 
    factory-method="getHostName"/> 

Để giải quyết các cấu hình thuộc tính tên tôi phải tham gia các chuỗi như sau, ${${**hostname**}.maxLength} cần được giải quyết như ${dev.maxLength}

tôi đã cố gắng sử dụng SpEL không thành công. Tôi nhận được Could not resolve placeholder Ngoại lệ. Làm thế nào tôi có thể nối một giá trị bean trong bộ giữ chỗ bất động sản? Tên thuộc tính động được xây dựng như thế nào?

mùa xuân phiên bản 3.2

Trả lời

2

tôi giải quyết vấn đề này bằng cách thay đổi PropertyPlaceholderConfigurer đậu để Properties. <util:properties/> có thể truy cập được trong Spel.

Ví dụ: "#{prop[host+'.'+'maxLength']}"

nơi host là một bean chuỗi.

+0

Tâm trí để chia sẻ XML của bạn? Tôi muốn làm điều tương tự nhưng không chắc chắn về những gì bạn đã đề cập bằng cách thay đổi nó thành Thuộc tính ... –

2

Nó sẽ là tốt hơn để có các tính chất môi trường cụ thể trong một tập tin riêng của mình và sử dụng Spring Profiles. Ví dụ, tôi có bốn tệp xml chỉ dành cho cấu hình db, local.db.xml, dev.db.xml, qa.db.xml và prod.db.xml. Bên trong mỗi tệp db.xml, tôi đặt cấu hình thành giá trị thích hợp.

local.db.xml tôi có

<beans profile="db.local" .. > 

Để khởi động Tomcat, tôi chỉ định các tùy chọn VM như sau

-Dspring.profiles.active=db.local 
+0

Tôi không thể sử dụng các biến môi trường/tài sản JVM, nó là một hạn chế chính sách. – user2235506

12

Để ghép các giá trị được phân tích cú pháp từ trình giữ chỗ thuộc tính Spring, bạn cần phải thoát khỏi giá trị của chúng bằng cách sử dụng các câu hỏi đơn ('') và bọc biểu thức trình giữ chỗ bằng biểu thức Spel sử dụng #{}.

<bean id="myService" class=""com.services.MyService"> 
    ... 
    <property name="endpointAddress" value="#{'${server}' + ':' + '${port}' + '${endpoint}'}" /> 
</bean> 

nơi:

server = http://domain.host.com

port = 7777

endpoint =/dịch vụ/MyService

Kết quả sẽ là:

http://domain.host.com:7777/services/myservice