wie automatisch kopieren von Werten aus java-bean zu protobuf message-Objekt mit java-reflection?
In der Regel konnte ich kopieren von Werten zwischen zwei java-beans , die über identische Namen für die Eigenschaft, mit beanutils mit java-reflection z.B. PropertyUtils.setProperty(....)
In protobuf Nachricht, die wir verwenden, der message-generator-Klasse, um den Wert festzulegen. Dies funktioniert, aber ich würde eher reflektion verwenden, um automatisch kopieren von Eigenschaften aus der Bohne in die Nachricht als identisch property-Namen und-Typ.
Wann rufe ich den PropertyUtils.setProperty auf dem builder-Objekt ( bekam von der Nachricht.newBuilder() ) , bekomme ich diese Meldung.
java.lang.NoSuchMethodException: Eigenschaft 'testProp' hat keine setter-Methode in der Klasse 'class teststuff.TestBeanProtos$TestBeanMessage$Builder'
Wie kann ich automatisch kopieren von Werten aus java-bean zu protobuf message-Objekt ( und Umgekehrt) mit Hilfe der java reflection ?
- Tun Builder setTestProp Methode?
- Ich sollte darauf hinweisen, dass das Ziel java-Objekt ist eine Instanz von com.google.protobuf.GeneratedMessage , die unveränderlich sind Bohnen. Daher kann die Verwendung von Raupen oder einfache reflektion Lesen/schreiben auf GeneratedMessage wird nicht funktionieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich kann deaktiviert werden, würde aber protostuff helfen? Es hat schöne erweiterte Unterstützung für das arbeiten mit anderen Daten-Formate, - Typen. Und auch wenn es nicht direkte Konvertierung unterstützen, wenn Sie nach/von JSON gibt es viele Möglichkeiten für gute Daten verbindlich.
Ich hasse meine Frage beantworten, aber ich kann nicht glauben, dass ich der einzige bin, der lief in dieses problem. Dokumentieren-Lösung hier für den Fall, andere Leute sind auch erste Schritte mit protobuf und java. Mit der spiegelung spart wrting Dutzende von getter und setter.
Ok , ich habe es geschafft, es zu bekommen, um die Arbeit mit einigen der Beispiel-test-code Versand mit protobuf. Dies ist ein sehr einfacher use-case, in der Regel eine Nachricht, wäre sehr viel komplizierter. Dieser code ist nicht mit verschachtelten Nachrichten oder wiederholte Nachrichten.
Ich weiß nicht, die Größe Ihres Projektes, sondern möchten Sie vielleicht, um zu versuchen,Dozer, ein mapper, die rekursiv kopiert Daten von einem Objekt an ein anderes Objekt des gleichen Typs oder zwischen verschiedenen Komplex-Typen. Unterstützt implizite und explizite Zuordnung als gut. Ich habe es in einem großen Projekt und hat sehr gut funktioniert. Es könnte so einfach sein wie
Können Sie gehen, werfen alle Eigenschaften getClass().getFields() und machen die Kopie mit der spiegelung. Es wird die smt wie:
+ wahrscheinlich möglicherweise werden Sie Verwendung Feld.setAccessible(true) Aufruf.
Ich habe das gleiche Problem, die Lösung ist etwas tricky.
Nutzen Sie bitte
MethodUtils.invokeMethod
statt.
wo der name der Methode ist "setXXX".