Get property keys by pattern from ResourceBundleMessageSource in spring
I have almost hundred properties like this
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
And I'd like to be able getting these properties (both keys/values) without previous knowledge of keys ...something like getPropertyPair(regexp .*.order.[a-z]*=)
Does anybody know if spring or JDK offers something for that ? I suppose I'm gonna have to get the ResourceBundle and get all the keys and regexp them...
I don't think you can do it in Spring, but here's some code that might help:
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));
}
}
}
It's a bit hacky but I'm sure you can tidy it up into something more useful.
A little late to the conversation, but I stumbled upon this answer from google...
There is a pure JDK implementation here in the matchingSubset() function that finds matches by iterating over the properties returned by propertyNames(). If you really needed to use a regex, it could be adapted fairly easily.
Code snippet posted below in case the link goes bad:
/**
* 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;
}
精彩评论