在Spring中从ResourceBundleMessageSource获取属性键

我有几百个这样的房产

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.[az]*=)

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

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

 public class Main { public static void main(String[] args) { ResourceBundle labels = ResourceBundle.getBundle("spring-regex/regex-resources", Locale.UK); Enumeration 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.[az]*\\|"); Matcher matcher = pattern.matcher(sb); // Attempt to find all matching keys List matchingLabelKeys = new ArrayList(); 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但我相信你可以把它整理成更有用的东西。

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

没有。

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

是。

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

在matchesSubset()函数中有一个纯JDK实现,它通过迭代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; 

}