2017-09-20 5 views
0

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; 
    } 
} 

Répondre

1

Créer une nouvelle instance GSON:

Gson gson = new GsonBuilder().registerTypeAdapter(FacturadoresListarResponse.class, 
     new FacturadoresListarRspSerializer()).create(); 

Créer une nouvelle GsonDataFormat en spécifiant l'instance Gson précédemment créé:

GsonDataFormat gsonDataFormat = new GsonDataFormat(gson, FacturadoresListarResponse.class); 

Spécifiez le format de données précédente de votre RouteBuildermarshal(DataFormat dataFormat) méthode:

.marshal(gsonDataFormat) 
+0

Merci! Cela a fonctionné en donnant la réponse attendue dans le bon ordre. –