gpt4 book ai didi

java - 如何使用 java 反射自动将值从 java bean 复制到 protobuf 消息对象?

转载 作者:搜寻专家 更新时间:2023-11-01 02:33:23 24 4
gpt4 key购买 nike

通常我可以在两个具有相同属性名称的 java bean 之间复制值,使用 BeanUtils 和 java 反射,例如PropertyUtils.setProperty(....)

在 protobuf Message 中,我们使用消息生成器类来设置值。这可行,但我宁愿使用反射自动将属性从 bean 复制到消息,因为两者具有相同的属性名称和类型。

当我在构建器对象(从 message.newBuilder() 获取)上调用 PropertyUtils.setProperty 时,我收到此消息。

java.lang.NoSuchMethodException: 属性 'testProp' 在类 'class teststuff.TestBeanProtos$TestBeanMessage$Builder' 中没有 setter 方法

如何使用 java 反射自动将值从 java bean 复制到 protobuf 消息对象(反之亦然)?

最佳答案

我不想回答我的问题,但我不敢相信我是唯一遇到这个问题的人。在此处记录解决方案,以防其他人也开始使用 protobuf 和 java。使用反射可以节省大量的 getter 和 setter。

好的,我设法使用 protobuf 附带的一些示例测试代码让它工作。这是一个非常简单的用例;通常,消息会复杂得多。此代码不处理嵌套消息或重复消息。

public static void setMessageBuilder(com.google.protobuf.GeneratedMessage.Builder message,Descriptors.Descriptor descriptor,Object srcObject) throws Exception {
String cname = srcObject.getClass().getName();
/*BeanMapper.getSimpleProperties -- this is a warpper method that gets the list of property names*/
List<String> simpleProps = BeanMapper.getSimpleProperties(srcObject.getClass());

Map map = new HashMap();
for (String pName : simpleProps) {
System.out.println(" processing property "+ pName);
Object value= PropertyUtils.getProperty(srcObject, pName);
if(value==null) continue;

Descriptors.FieldDescriptor fd=descriptor.findFieldByName(pName) ;

System.out.println(" property "+ pName+" , found fd :"+ (fd==null ? "nul":"ok"));
message.setField(fd, value);
System.out.println(" property "+ pName+" set ok,");

}
return ;
}

关于java - 如何使用 java 反射自动将值从 java bean 复制到 protobuf 消息对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4053691/

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