2013-02-07 22 views
9

tôi có nộp tính như thế này:Đọc một bản đồ bất động sản năng động vào mùa xuân quản lý đậu

my.properties file: 
app.One.id=1 
app.One.val=60 

app.Two.id=5 
app.Two.val=75 

Và tôi đọc những giá trị này vào một tài sản đồ trong đậu của tôi trong mùa xuân tập tin cấu hình như thế này:

spring-config.xml: 
<bean id="myBean" class="myClass" scope="singleton"> 
    <property name="myMap"> 
     <map> 
      <entry key="${app.One.id}" value="${app.One.val}"/> 
      <entry key="${app.Two.id}" value="${app.Two.val}"/> 
     </map> 
    </property> 
</bean> 

Bằng cách này, nếu tôi thêm id/val mới vào tệp thuộc tính, tôi phải thêm hàng trong cấu hình xml để có id/val mới trong myMap.

Câu hỏi của tôi là, có cách để chỉ định cặp khóa-val trong tệp cấu hình mùa xuân để số key-vals được xác định trong xml có thể tìm ra các mục trong tệp thuộc tính và tạo bản đồ hay không. Về cơ bản, tôi muốn sử dụng tệp xml này trong các môi trường khác nhau, nơi chúng tôi sử dụng số lượng các mục khóa-giá trị khác nhau trong tệp thuộc tính. Tôi chỉ không muốn thay đổi tệp xml trong mỗi môi trường để đọc trong tất cả các giá trị này.

Hãy cho tôi biết nếu bạn cần bất kỳ chi tiết nào khác. Bất kỳ suy nghĩ/ý kiến ​​được đánh giá cao. Cảm ơn!

+0

Bạn có thể xem lại giải pháp của tôi, cảm ơn. – Vitaly

Trả lời

7

này được thực hiện với mùa xuân EL và xử lý tùy chỉnh.

Thật thú vị khi tôi thử nó. Nó hoạt động :)

application.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd 
    "> 

    <util:properties id="values" location="values.properties" /> 

    <bean id="hello" class="my.Hello"> 
     <property name="map" 
      value="#{T(my.Utils).propsToMap(values, '^(app\.\w*)\.id$', '{idGroup}.val')}" /> 
    </bean> 

</beans> 

Utils.java

package my; 

import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Properties; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Utils { 

    public static Map<String, String> propsToMap(Properties props, 
      String idPatternString, String valuePatternString) { 

     Map<String, String> map = new HashMap<String, String>(); 

     Pattern idPattern = Pattern.compile(idPatternString); 

     for (Enumeration<?> en = props.propertyNames(); en.hasMoreElements();) { 
      String key = (String) en.nextElement(); 
      String mapKey = (String) props.getProperty(key); 

      if (mapKey != null) { 
       Matcher idMatcher = idPattern.matcher(key); 
       if (idMatcher.matches()) { 

        String valueName = valuePatternString.replace("{idGroup}", 
          idMatcher.group(1)); 
        String mapValue = props.getProperty(valueName); 

        if (mapValue != null) { 
         map.put(mapKey, mapValue); 
        } 
       } 
      } 
     } 

     return map; 
    } 
} 

Hello.java

package my; 

import java.util.Map; 

public class Hello { 

    private Map<String, String> map; 

    public Map<String, String> getMap() { 
     return map; 
    } 

    public void setMap(Map<String, String> map) { 
     this.map = map; 
    } 
} 

values.properties

app.One.id=1 
app.One.val=60 

app.Two.id=5 
app.Two.val=75 
1

Đây là vấn đề môi trường kinh điển.

Có hai cách để làm điều này:

  1. Thêm một chuỗi môi trường vào cuối của tập tin .properties phù hợp; chuyển giá trị đó cho ứng dụng khi nó bắt đầu và để Spring chọn đúng giá trị.
  2. Đặt các thuộc tính động đó vào cơ sở dữ liệu và truy vấn cho chúng khi khởi động. JNDI cho cơ sở dữ liệu sẽ chọn đúng giá trị.
+0

Chúng tôi không muốn làm điều này bằng cách sử dụng DB. Tôi đã tìm kiếm một cái gì đó giống như [Here] (http://stackoverflow.com/questions/5274362/reading-a-dynamic-property-list-into-a-spring-managed-bean). Có nó dễ dàng hơn vì nó chỉ là một danh sách, nhưng tôi đã tự hỏi nếu có cái gì đó tương đương được sử dụng với bản đồ? – kriver

+0

Vì bản đồ IS-A của tài sản, tôi không hiểu tại sao không. Thử nó. – duffymo

0

Tôi không tìm thấy cách lý tưởng để giải quyết vấn đề này để có thuộc tính bản đồ động được đọc vào thông tin cấu hình mùa xuân. Sử dụng DB cũng không phải là một lựa chọn cho chúng tôi. Đây là những gì tôi thấy là sự thay thế tốt nhất cho việc này:

  • Sử dụng một định dạng chuẩn cho khóa bản đồ/cặp giá trị trong các thuộc tính tập tin ví dụ: key1 | val1, key2 | val2, key3 | val3, ..., keyn | valn

  • đọc này cho một người sở hữu chuỗi hoặc tài sản List trong đậu cấu hình như ở đây: Use String to List

  • Lết lớp tiêm java chia các mục vào bản đồ trong setter.

Tôi sẽ đánh dấu đây là câu trả lời. Nếu bất cứ ai khác có cách tốt hơn để làm điều này, hãy bình luận và tôi sẽ thay đổi nó để trả lời.

4

Có thể tôi chưa hiểu đầy đủ vấn đề ở đây ...
Còn cách tiếp cận đơn giản thì sao?

my.properties file: 
1=60 
5=75 

Application Context

<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="locations"> 
     <list> 
     <value>classpath: my.properties</value> 
     </list> 
    </property> 
</bean> 
<bean id="myClass" class="com.pakage.MyClass"> 
    <property name="myMap" ref=" myProperties"/> 
</bean> 

Java Bean

public class MyClass { 
    private Map<String , String> myMap; 

    public void setMyMap(Map<String, String> myMap) { 
     this.myMap = myMap; 
    } 

    public Map<String , String> getMyMap(){ 
     return myMap; 
    } 
}