2017-09-20 271 views
0

我有一個Camel端點,它返回屬性爲JSON,但沒有正確的順序。 return類有一個超類,它返回一些控制數據,這些數據在每個返回中都必須存在。Apache Camel - 在路由上使用GSON JsonSerializer

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 

而最終的返回類繼承那一塊。

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

所以,GSON的第一次的Marshaller需要繼承的類屬性(LST),然後父類屬性(主體,狀態等),使這種結果的絲。

{ 
    "lst": [ 
    { 
     "rut": "XXXX-X", 
     "rzsoc": "XXXXXXx", 
     "res": 1, 
     "ema": "[email protected]" 
    } 
    ], 
    "subject": "facturadores", 
    "action": "listar", 
    "status": 0, 
    "description": "OK" 
} 

我寫了一個GSON自定義JsonSerializer,它按順序構建數據,但我不能在Camel DSL語法中使用。我試過,但沒有結果:

.marshal().json(JsonLibrary.Gson,FacturadoresListarRspSerializer.class, true) 
.convertBodyTo(String.class, "UTF-8") 

是否存在被駱駝支持,能夠使用這些類型的串行器來實現正確的順序不遷移到傑克遜?

注意:序列化程序的代碼(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; 
    } 
} 

回答

1

創建一個新的GSON實例:

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

創建一個新的GsonDataFormat通過指定以前創建Gson例如:

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

指定您RouteBuildermarshal(DataFormat dataFormat)以前的數據格式方法:

.marshal(gsonDataFormat) 
+0

謝謝!它按正確的順序給出了預期的響應。 –