通常我可以在两个具有相同属性名称的 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/