Java 17
方法1. 変換表のMapを宣言&設定(プログラム内でput)
変換後のキーと値のリストを List にまとめる。
String.join("&") を使って "key=value" のリストを結合。
LinkedHashMap を使うことで元の順序を維持。
Map<String, String> KEY_MAPPING = new HashMap<>();
KEY_MAPPING.put("oldKey1", "newKey1");
KEY_MAPPING.put("oldKey2", "newKey2");
String queryString = "oldKey1=value1&oldKey2=value2&otherKey=value3&oldKey1=value4";
if (StringUtils.isEmpty(queryString)) {
// 文字列がnullか空文字の時は処理をしない
} else {
// クエリ文字列をパースして変換
Map<String, List<String>> convertedParams = new LinkedHashMap<>();
// クエリ文字列を "&" で分割
String[] pairs = queryString.split("&");
for (String pair : pairs) {
String[] keyValue = pair.split("=", 2);
String oldKey = keyValue[0];
String value = keyValue.length > 1 ? keyValue[1] : "";
// 変換マップを使用してキー名を変更
String newKey = KEY_MAPPING.getOrDefault(oldKey, oldKey);
// 変換後のパラメータをマップに格納(リストで管理)
convertedParams.computeIfAbsent(newKey, k -> new ArrayList<>()).add(value);
}
// 変換後のパラメータをクエリ文字列に戻す
List<String> paramList = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : convertedParams.entrySet()) {
String key = entry.getKey();
for (String value : entry.getValue()) {
paramList.add(key + "=" + value);
}
}
String restoredQuery = String.join("&", paramList);
System.out.println("restoredQuery: " + restoredQuery);
}
実行結果
restoredQuery: newKey1=value1&newKey1=value4&newKey2=value2&otherKey=value3
方法2. 変換表のMapを宣言&設定(プロパティファイルから読み込み)
src/main/resources/key_mapping.properties
oldKey1=newKey1
oldKey2=newKey2
Map<String, String> KEY_MAPPING = loadKeyMappings("key_mapping");
String queryString = "oldKey1=value1&oldKey2=value2&otherKey=value3&oldKey1=value4";
if (StringUtils.isEmpty(queryString)) {
// 文字列がnullか空文字の時は処理をしない
} else {
// クエリ文字列をパースして変換
Map<String, List<String>> convertedParams = new LinkedHashMap<>();
// クエリ文字列を "&" で分割
String[] pairs = queryString.split("&");
for (String pair : pairs) {
String[] keyValue = pair.split("=", 2);
String oldKey = keyValue[0];
String value = keyValue.length > 1 ? keyValue[1] : "";
// 変換マップを使用してキー名を変更
String newKey = KEY_MAPPING.getOrDefault(oldKey, oldKey);
// 変換後のパラメータをマップに格納(リストで管理)
convertedParams.computeIfAbsent(newKey, k -> new ArrayList<>()).add(value);
}
// 変換後のパラメータをクエリ文字列に戻す
List<String> paramList = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : convertedParams.entrySet()) {
String key = entry.getKey();
for (String value : entry.getValue()) {
paramList.add(key + "=" + value);
}
}
String restoredQuery = String.join("&", paramList);
System.out.println("restoredQuery: " + restoredQuery);
}
private Map<String, String> loadKeyMappings(String baseName) {
Map<String, String> keyMap = new HashMap<>();
try {
ResourceBundle bundle = ResourceBundle.getBundle(baseName);
for (String key : bundle.keySet()) {
String value = bundle.getString(key);
if (StringUtils.isEmpty(value)) {
throw new IllegalArgumentException("エラー: キー '" + key + "' の値が空です。プロパティファイルを修正してください。");
}
keyMap.put(key, value);
}
} catch (MissingResourceException e) {
System.err.println("エラー: プロパティファイル '" + baseName + ".properties' が見つかりません。");
throw e; // そのまま例外を投げて処理を中断
}
return keyMap;
}
実行結果
restoredQuery: newKey1=value1&newKey1=value4&newKey2=value2&otherKey=value3