在Spring中从ResourceBundleMessageSource获取属性键

时间:2010-11-21 21:41:02

标签: java spring properties

我有几百个这样的属性

    NotEmpty.order.languageFrom=Field Language can't be empty
    NotEmpty.order.languageTo=Field Language can't be empty
    NotEmpty.order.description=Description field can't be empty
    NotEmpty.order.formType=FormType field can't be empty
    NotEmpty.cart.formType=FormType field can't be empty
    NotEmpty.cart.formType=FormType field can't be empty

我希望能够在没有密钥知识的情况下获得这些属性(包括键/值)......例如getPropertyPair(regexp .*.order.[a-z]*=)

有人知道spring或JDK是否提供了相应的东西吗?我想我必须得到ResourceBundle并获取所有密钥并正则表达它们......

3 个答案:

答案 0 :(得分:6)

我认为你不能在Spring中做到这一点,但这里有一些可能有用的代码:

public class Main {
  public static void main(String[] args) {
    ResourceBundle labels = ResourceBundle.getBundle("spring-regex/regex-resources", Locale.UK);
    Enumeration<String> labelKeys = labels.getKeys();

    // Build up a buffer of label keys
    StringBuffer sb = new StringBuffer();
    while (labelKeys.hasMoreElements()) {
      String key = labelKeys.nextElement();
      sb.append(key + "|");
    }

    // Choose the pattern for matching
    Pattern pattern = Pattern.compile(".*.order.[a-z]*\\|");
    Matcher matcher = pattern.matcher(sb);

    // Attempt to find all matching keys
    List<String> matchingLabelKeys = new ArrayList<String>();
    while (matcher.find()) {
      String key=matcher.group();
      matchingLabelKeys.add(key.substring(0,key.length()-1));
    }

    // Show results
    for (String value: matchingLabelKeys) {
      System.out.format("Key=%s Resource=%s",value,labels.getString(value));
    }

  }

}

有点hacky但我相信你可以将它整理成更实用的东西。

答案 1 :(得分:3)

  

有人知道spring或JDK是否提供了相应的东西吗?

没有

  

我想我必须得到ResourceBundle并获取所有密钥并正则表达它们......

答案 2 :(得分:1)

谈话有点晚了,但我偶然发现谷歌的这个答案......

matchSubset()函数中有一个纯JDK实现here,它通过遍历propertyNames()返回的属性来查找匹配项。如果你真的需要使用正则表达式,它可以很容易地适应。

如果链接变坏,请在下面发布代码段:

/**
 *  Copyright 2007 University Of Southern California
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

public Properties matchingSubset(String prefix, boolean keepPrefix) {
Properties result = new Properties();

// sanity check
if (prefix == null || prefix.length() == 0) {
  return result;
}

String prefixMatch; // match prefix strings with this
String prefixSelf; // match self with this
if (prefix.charAt(prefix.length() - 1) != '.') {
  // prefix does not end in a dot
  prefixSelf = prefix;
  prefixMatch = prefix + '.';
} else {
  // prefix does end in one dot, remove for exact matches
  prefixSelf = prefix.substring(0, prefix.length() - 1);
  prefixMatch = prefix;
}
// POSTCONDITION: prefixMatch and prefixSelf are initialized!

// now add all matches into the resulting properties.
// Remark 1: #propertyNames() will contain the System properties!
// Remark 2: We need to give priority to System properties. This is done
// automatically by calling this class's getProperty method.
String key;
for (Enumeration e = propertyNames(); e.hasMoreElements(); ) {
  key = (String) e.nextElement();

  if (keepPrefix) {
    // keep full prefix in result, also copy direct matches
    if (key.startsWith(prefixMatch) || key.equals(prefixSelf)) {
      result.setProperty(key,
                         getProperty(key));
    }
  } else {
    // remove full prefix in result, dont copy direct matches
    if (key.startsWith(prefixMatch)) {
      result.setProperty(key.substring(prefixMatch.length()),
                         getProperty(key));
    }
  }
}

// done
return result;

}