gpt4 book ai didi

java - 使用 "BeanUtils alike"替换的最简单方法

转载 作者:行者123 更新时间:2023-11-30 07:39:40 27 4
gpt4 key购买 nike

是否有任何库允许我使用与在 BeanUtils 中使用的相同的已知符号来提取 POJO 参数,但可以轻松替换字符串中的占位符?

我知道可以自己动手,使用 BeanUtils 本身或其他具有类似功能的库,但我不想重新发明轮子。

我想要一个字符串如下:

String s = "User ${user.name} just placed an order. Deliver is to be
made to ${user.address.street}, ${user.address.number} - ${user.address.city} /
${user.address.state}";

并在下面传递 User 类的一个实例:

public class User {
private String name;
private Address address;
// (...)

public String getName() { return name; }
public Address getAddress() { return address; }
}

public class Address {
private String street;
private int number;
private String city;
private String state;

public String getStreet() { return street; }
public int getNumber() { return number; }
// other getters...
}

类似于:

System.out.println(BeanUtilsReplacer.replaceString(s, user));

将每个占位符替换为实际值。

有什么想法吗?

最佳答案

使用 BeanUtils 自己滚动不会需要太多的轮子重新发明(假设您希望它像要求的那样基本)。此实现采用 Map 作为替换上下文,其中 map 键应对应于为替换给出的变量查找路径的第一部分。

import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.beanutils.BeanUtils;

public class BeanUtilsReplacer
{
private static Pattern lookupPattern = Pattern.compile("\\$\\{([^\\}]+)\\}");

public static String replaceString(String input, Map<String, Object> context)
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
{
int position = 0;
StringBuffer result = new StringBuffer();

Matcher m = lookupPattern.matcher(input);
while (m.find())
{
result.append(input.substring(position, m.start()));
result.append(BeanUtils.getNestedProperty(context, m.group(1)));
position = m.end();
}

if (position == 0)
{
return input;
}
else
{
result.append(input.substring(position));
return result.toString();
}
}
}

鉴于您的问题中提供的变量:

Map<String, Object> context = new HashMap<String, Object>();
context.put("user", user);
System.out.println(BeanUtilsReplacer.replaceString(s, context));

关于java - 使用 "BeanUtils alike"替换的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/145052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com