J'ai un point de terminaison avec Camel qui retourne des propriétés en tant que JSON, mais ne sont pas dans le bon ordre. La classe return a une super-classe qui renvoie des données de contrôle qui doivent nécessairement être présentes dans chaque retour.Apache Camel - utilisation de JSONSerializer GSON sur les routes
public class Respuesta implements Serializable {
@SerializedName("subject")
@Expose
private String subject;
@SerializedName("action")
@Expose
private String action;
@SerializedName("status")
@Expose
private Integer status;
@SerializedName("description")
@Expose
private String description;
...getter/setter
Et la classe de retour finale hérite de cette pièce.
public class FacturadoresListarResponse extends Respuesta implements Serializable {
@SerializedName("lst")
@Expose
private List<Facturador> listaProveedores;
public FacturadoresListarResponse(List<Facturador> listaProveedores) {
super();
this.listaProveedores = listaProveedores;
}
public FacturadoresListarResponse() {
}
public void setRespuesta(Respuesta rsp) {
super.setAction(rsp.getAction());
super.setDescription(rsp.getDescription());
super.setStatus(rsp.getStatus());
super.setSubject(rsp.getSubject());
}
getter/setter...
}
Ainsi, Marshaller du Gson prend d'abord la propriété de classe héritée (LST), puis les propriétés de la classe parent (sous réserve, statut, etc.), ce qui donne ce genre de résultat sur le fil.
{
"lst": [
{
"rut": "XXXX-X",
"rzsoc": "XXXXXXx",
"res": 1,
"ema": "[email protected]"
}
],
"subject": "facturadores",
"action": "listar",
"status": 0,
"description": "OK"
}
J'ai écrit une JsonSerializer personnalisée GSON qui construit des données dans l'ordre, mais je ne peux pas utiliser dans une syntaxe DSL Camel. J'ai essayé, mais sans résultats:
.marshal().json(JsonLibrary.Gson,FacturadoresListarRspSerializer.class, true)
.convertBodyTo(String.class, "UTF-8")
Est-il soutenu par Camel d'utiliser ce genre de serializers pour atteindre le bon ordre sans migration vers Jackson?
Remarque: Le code du sérialiseur (FacturadoresListarRspSerializer.class).
public class FacturadoresListarRspSerializer implements JsonSerializer<FacturadoresListarResponse> {
@Override
public JsonElement serialize(FacturadoresListarResponse src, Type typeOfSrc, JsonSerializationContext context) {
final JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("subject", src.getSubject());
jsonObject.addProperty("action", src.getAction());
jsonObject.addProperty("status", src.getStatus());
jsonObject.addProperty("description", src.getDescription());
final JsonArray jsarrFacturadores = new JsonArray();
for (final Facturador fact : src.getListaProveedores()) {
JsonObject jsobFacturadores = new JsonObject();
jsobFacturadores.addProperty("rut", fact.getRutCompleto());
jsobFacturadores.addProperty("rzsoc", fact.getRazonSocial());
jsobFacturadores.addProperty("res", fact.getResolucion());
jsobFacturadores.addProperty("ema", fact.getCorreoEnvio());
jsarrFacturadores.add(jsobFacturadores);
}
jsonObject.add("lst", jsarrFacturadores);
return jsonObject;
}
}
Merci! Cela a fonctionné en donnant la réponse attendue dans le bon ordre. –