2016-08-19 13 views
0

Привет Я пытаюсь загрузить конфигурацию из строки в Java следующим образом:типизированного ConfigFactory ошибка зарезервированных символов

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

Код выше выдает следующее сообщение об ошибке:

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) 

Я понимаю, у меня есть незаконный символ в моей строке. Хотя, как я могу найти полный набор незаконных символов?

Если я (например) преобразовать эту строку в Properties объект, а затем разобрать его с ConfigFactory.parseProperties я могу увидеть значение "\\asd" в разрешенном в качестве "asd". Так должен быть некоторое некоторые дезинфицирующего происходит в библиотеке типизированной, я Хотелось бы, чтобы я сам назвал эту санитарию, но я не понимаю, как это сделать. Анализ Parsing to Properties не является жизнеспособным решением, так как конфигурация может быть составлена ​​с помощью объектов или списков.

Есть ли у кого-нибудь предложения, как решить эту проблему?

Возможно, кто-то может указать на все зарезервированные символы?

Большое спасибо

ответ

0

Если я правильно понял сообщение об ошибке правильно, вы должны поставить кавычки вокруг вас специальные символы, например, как это:

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

Не знаю, почему вы хотеть определение свойств с помощью обратной косой черты а («\ а») в нем, но я думаю, мне не нужно знать :-)

+0

Вы правы, но мой вопрос будет, как я программно применяю стратегию, чтобы избежать проблемы? Я подумал о том, чтобы поймать Исключение, а затем повторить попытку, но это была бы плохая практика. – nuvio

+0

Чтобы прояснить этот ввод, это не сработает. Спасибо за ваше предложение. – nuvio

0

Я думаю, Я мог бы найти ответ. Мне нужно установить ConfigParseOptions.defaults().setSyntax(ConfigSyntax.PROPERTIES)

, который работает для теста ниже:

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

Но не будет работать для теста с обратной косой черты

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

которая не:

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

Поэтому я не уверен, что это окончательный ответ ...