2016-08-19 3 views
0

Salut, je suis en train de charger la configuration à partir d'une chaîne en Java comme suit:Typesafe erreur ConfigFactory avec des caractères réservés

@Test 
public void testIllegalCharacter(){ 
    String input = "prop=\\asd"; 
    Config conf = ConfigFactory.parseString(input); 
} 

Le code ci-dessus produit l'erreur suivante:

com.typesafe.config.ConfigException$Parse: String: 1: Expecting a value but got wrong token: '\' (Reserved character '\' is not allowed outside quotes) (if you intended '\' (Reserved character '\' is not allowed outside quotes) to be part of a key or string value, try enclosing the key or value in double quotes, or you may be able to rename the file .properties rather than .conf) 

Je comprends que j'ai un caractère illégal dans ma chaîne. Bien que comment puis-je trouver l'ensemble des caractères illégaux?

Si I (par exemple) convertir cette chaîne dans un objet Properties puis l'analyser avec ConfigFactory.parseProperties je peux voir la valeur "\\asd" en a décidé que "asd". donc il doit y avoir une certaine désinfectante passe dans la bibliothèque de typesafe, je Je voudrais pouvoir appeler cette aseptisation moi-même, mais je ne vois pas comment. L'analyse des propriétés n'est pas une solution viable car la configuration peut également être composée d'objets ou de listes.

Quelqu'un a-t-il des suggestions pour résoudre ce problème?

Est-ce que quelqu'un peut également indiquer tous les caractères réservés?

Un grand merci

Répondre

0

Si je comprends le message d'erreur correctement, vous devez mettre des guillemets autour de vous des caractères spéciaux, par exemple comme ceci:

"prop=\"\\asd\""; 

Je ne sais pas pourquoi vous voulez une définition de la propriété avec une barre oblique inverse un (« \ a ») en elle, mais je suppose que je ne ai pas besoin de savoir :-)

+0

Vous avez raison, mais ma question serait, comment puis-je appliquer une stratégie par programme pour éviter le problème? J'ai pensé attraper l'Exception et ensuite réessayer, mais ce serait une mauvaise pratique. – nuvio

+0

Pour clarifier cette entrée ne fonctionnera pas. Merci pour votre suggestion. – nuvio

0

Je pense J'aurais peut-être trouvé la réponse. Je dois régler la ConfigParseOptions.defaults().setSyntax(ConfigSyntax.PROPERTIES)

Ce qui fonctionne pour le test ci-dessous:

@Test 
    public void test(){ 
     String input = "prop=C:/MyDocuments/mydir"; 
     Config conf = ConfigFactory.parseString(input, ConfigParseOptions.defaults().setSyntax(ConfigSyntax.PROPERTIES)); 
     assertEquals("C:/MyDocuments/mydir", conf.getAnyRef("prop")); 
    } 

Mais ne fonctionnera pas pour le test avec antislashs

@Test 
    public void test(){ 
     String input = "prop=C:\\MyDocuments\\mydir"; 
     Config conf = ConfigFactory.parseString(input, ConfigParseOptions.defaults().setSyntax(ConfigSyntax.PROPERTIES)); 
     assertEquals("C:\\MyDocuments\\mydir", conf.getAnyRef("prop")); 
    } 

IRREGULIERE:

org.junit.ComparisonFailure: 
Expected :C:\MyDocuments\mydir 
Actual :C:MyDocumentsmydir 

Donc, je ne suis pas sûr que ce soit la réponse définitive ...