2010-11-21 14 views
2

J'ai presque cent biens similairesObtenir les clés de la propriété par le modèle de ResourceBundleMessageSource au printemps

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 

Et je voudrais être en mesure d'obtenir ces propriétés (les clés/valeurs) sans connaissance préalable des clés .. quelque chose comme getPropertyPair(regexp .*.order.[a-z]*=)

Est-ce que quelqu'un sait si le printemps ou JDK offre quelque chose pour cela? Je suppose que je vais devoir obtenir le ResourceBundle et obtenir toutes les clés et les regexp ...

Répondre

6

Je ne pense pas que vous pouvez le faire au printemps, mais voici un code qui pourrait aider:

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)); 
    } 

    } 

} 

Il est un peu hacky mais je suis sûr que vous pouvez ranger vers le haut en quelque chose de plus utile.

+0

merci Gary, ces codes d'erreur printaniers, résolveurs, processeurs, bundles de ressources ... c'est tellement en désordre que ça a été totalement confus ... Si la validation printanière n'est pas faite au printemps et que le style style taglib, c'est dur – lisak

+0

@lisak Pas de problème - heureux d'aider. Le printemps est génial, mais parfois il vaut mieux rester simple. –

3

Est-ce que quelqu'un sait si le printemps ou JDK offre quelque chose pour cela?

n °

Je suppose que je vais devoir obtenir le ResourceBundle et obtenir toutes les clés et les expressions rationnelles ...

Oui.

+0

Vous savez, se resourceBundle est pas tout à fait facile, ResourceBundleMessageSource.getResouceBundle est protégé et l'extension de cette classe est surpuissant. La résolution de resourceBundle en fonction des paramètres régionaux n'est pas facile du tout. Vous ne devriez pas avoir à répondre si brièvement. En général, les gens ne répondent pas aux questions exactement comme ils ont été demandés, mais ils sentent ce que l'on veut dire. Non/Oui – lisak

+0

Je veux dire, je savais Non/oui, mais qu'est-ce qui devrait suivre? – lisak

+0

N'êtes-vous pas trop compliqué? Utilisez ['ResourceBundle # getBundle()'] (http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html#getBundle%28java.lang.String,%20java.util. Locale% 29) pour obtenir l'ensemble désiré et utiliser ['ResourceBundle # keySet()'] (http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html#keySet%28 % 29) pour obtenir toutes les clés. Désolé, il n'était pas évident d'après la question que vous ayez du mal à obtenir le paquet et les clés manuellement. – BalusC

1

Un peu plus tard à la conversation, mais je suis tombé sur cette réponse de Google ...

Il y a une mise en œuvre pur here dans la JDK fonction matchingSubset() qui trouve des correspondances par itérer sur les propriétés retournées par propertyNames(). Si vous aviez vraiment besoin d'une regex, elle pourrait être adaptée assez facilement.

extrait de code affiché ci-dessous dans le cas où le lien va mal:

/** 
* 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; 

}

+0

Merci beaucoup. Cet article est super. –