Подстановка строк не работает при первом появлении - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно заменить какой-либо шаблон текстовыми значениями и значениями json.

Моя проблема: первое значение замещения не подставляется.

У меня есть следующий код:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.text.StringSubstitutor;

public class TestStringSubstitutor {

  public static void main(String[] args) {
    Map<String, String> parameters = new HashMap<>();
    Map<String, String> jsonParameters = new HashMap<>();
    parameters.put("entityId", "someid");
    parameters.put("name", "someName");
    parameters.put("now", ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT).toString());

    jsonParameters.put("info", "{\"name\":\"John\",\"age\":30,\"car\":null}");


    String template = "{\"description\":\"this is ja unit test\",\"time\":\"{now}\",\"name\":\"{name}\",\"entityId\":\"{entityId}\",\"info\":\"{{info}}\"}";
    System.out.println("           template:" + template);

    String modMessage = StringSubstitutor.replace(template, parameters, "{", "}");
    System.out.println("replaced Message #1:" + modMessage);

    modMessage = StringSubstitutor.replace(modMessage, jsonParameters, "\"{{", "}}\"");
    System.out.println("replaced Message #2:" + modMessage);
  }

}

Вывод:

           template:{"description":"this is a unit test","time":"{now}","name":"{name}","entityId":"{entityId}","info":"{{info}}"}
replaced Message #1:{"description":"this is a unit test","time":"{now}","name":"someName","entityId":"someid","info":"{{info}}"}
replaced Message #2:{"description":"this is a unit test","time":"{now}","name":"someName","entityId":"someid","info":{"name":"John","age":30,"car":null}}

Задача {сейчас} должна быть заменена ...

Если я изменю порядок шаблона: name <-> time

String template = "{\"description\":\"this is a unit test\",\"name\":\"{name}\",\"time\":\"{now}\",\"entityId\":\"{entityId}\",\"info\":\"{{info}}\"}";

, тогда выводизменяется, {now} подставляется, но первое значение подстановки {name} по-прежнему не подставляется.

           template:{"description":"this is a unit test","name":"{name}","time":"{now}","entityId":"{entityId}","info":"{{info}}"}
replaced Message #1:{"description":"this is a unit test","name":"{name}","time":"2019-10-01T08:35:10.961177100Z","entityId":"someid","info":"{{info}}"}
replaced Message #2:{"description":"this is a unit test","name":"{name}","time":"2019-10-01T08:35:10.961177100Z","entityId":"someid","info":{"name":"John","age":30,"car":null}}

Это ошибка или я что-то пропустил?

1 Ответ

0 голосов
/ 01 октября 2019

Намек от Йоаким-Даниелсон решил проблему. Префикс '{' и суффикс '}' не является уникальным.

Теперь используется '{{' и '}}'.

Вот рабочий пример:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.text.StringSubstitutor;

public class TestStringSubstitutor {

  public static void main(String[] args) {
    Map<String, String> parameters = new HashMap<>();
    Map<String, String> jsonParameters = new HashMap<>();
    parameters.put("entityId", "someid");
    parameters.put("name", "someName");
    parameters.put("now", ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT).toString());

    jsonParameters.put("info", "{\"name\":\"John\",\"age\":30,\"car\":null}");


    String template = "{\"name\":\"{{name}}\",\"time\":\"{{now}}\",\"entityId\":\"{{entityId}}\",\"info\":\"{{info}}\", \"description\":\"this is a unit test\"}";
    System.out.println("           template:" + template);

    String modMessage = StringSubstitutor.replace(template, parameters, "{{", "}}");
    System.out.println("replaced Message #1:" + modMessage);

    modMessage = StringSubstitutor.replace(modMessage, jsonParameters, "\"{{", "}}\"");
    System.out.println("replaced Message #2:" + modMessage);
  }

}

Выход

           template:{"name":"{{name}}","time":"{{now}}","entityId":"{{entityId}}","info":"{{info}}", "description":"this is a unit test"}
replaced Message #1:{"name":"someName","time":"2019-10-01T10:56:54.991583700Z","entityId":"someid","info":"{{info}}", "description":"this is a unit test"}
replaced Message #2:{"name":"someName","time":"2019-10-01T10:56:54.991583700Z","entityId":"someid","info":{"name":"John","age":30,"car":null}, "description":"this is a unit test"}
...