Символы и специальные символы на картах в виде ключей через YML-файл - PullRequest
0 голосов
/ 10 марта 2020

Можно ли хранить такие символы, как : ; / , . в ключах на карте в Java , который отображается через application.yml ?

Я пытаюсь сохранить URI и значение, связанное с ними, через отображение в файле application.yml, однако, поскольку он является ключом, он не сохраняет никаких специальных символов

http://localhost: 8080 становится httplocalhost8080

Есть ли способ сохранить эти потерянные символы?

~~ EDIT ~~ Я пробовал escape-символы, double, и одинарные кавычки вокруг ключей, и все же, когда они находятся в хэш-карте, они игнорируются.

Свойство в файле yml имеет следующую структуру:

  uri-example-config:
    keyToValueMap:
      http://localhost:8080 : String1
      http://exmaple.com: String2
      http://moreURIs.com: String2

И тогда моя конфигурация:

@Configuration
@ConfigurationProperties(prefix = "uri-example-config")
@EnableConfigurationProperties
@Getter
@Setter
public class URIProperties {
    private Map<String, String> keyToValueMap = new HashMap<>();
}

~~~~ РЕДАКТИРОВАТЬ 2 ~~~~

Да, я могу легко отобразить map.put ("http://localhost: 8080"...) и строки сохраняются, как и ожидалось. Выполнение этого через файл yml с настройками и свойствами вызывает эту проблему.

Ответы [ 4 ]

1 голос
/ 10 марта 2020

Java HashMap принимает любой объект (String является объектом) в качестве ключа! Кроме того, HashMap не будет записывать / изменять вашу строку.

Я думаю, что ваша проблема связана с загрузкой вашего .yml

Yaml принимает специальные символы в качестве ключа, если его в двойных кавычках.

- "http://localhost:8080"

Проверьте ваш сериализатор / десериализатор

Редактировать Там это объяснение на github проекта

Вы должны заключить вашу строку в скобки

- '[http://localhost:8080]'
0 голосов
/ 10 марта 2020

Да, можно использовать такие символы, как : ; / , . в String ключе Map, если ключ имеет тип String, поэтому карта может принимать любую строку с любым символом.

Ключ должен иметь тип класса, который реализует методы equals и hashCode. Если эти методы недоступны, они будут унаследованы от класса Object.

0 голосов
/ 10 марта 2020

Да, это

Для вашего примера в java вам просто нужно избежать этого.

    Map testmap=new HashMap<String,Object>();
    Object testObject="a value Object";
    testmap.put("http://localhost:8080",testObject);
    for (Object s:testmap.keySet()) {
        System.out.println(s);
    }

Распечатает:

http://localhost: 8080

0 голосов
/ 10 марта 2020

Может быть, вы можете создать URI следующим образом:

URI uri = new URI("http", null, "localhost", "8080", "/my/api");
String uriAsString = uri.toASCIIString();

и затем установить его на карту в виде строки.

Я предлагаю вам взглянуть на В этом посте вы можете найти решение: HTTP-кодировка URL-адреса в Java

...