Apache Camel - GSON JsonSerializer在路由上使用

时间:2017-09-20 19:41:57

标签: java json apache-camel gson dsl

我有一个使用Camel的端点,它返回属性为JSON,但没有正确的顺序。返回类有一个超类,它返回一些控制数据,每次返回都必须存在这些数据。

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": "a@a.cl"
    }
  ],
  "subject": "facturadores",
  "action": "listar",
  "status": 0,
  "description": "OK"
}

我编写了一个按顺序构建数据的GSON自定义JsonSerializer,但我无法在Camel DSL语法中使用。我试过了,但没有结果:

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

Camel是否支持使用这些序列化程序来实现正确的顺序而无需迁移到Jackson?

注意:序列化程序的代码(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 个答案:

答案 0 :(得分:1)

创建一个新的GSON实例:

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

通过指定先前创建的GsonDataFormat实例来创建新的Gson

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

使用RouteBuilder的{​​{1}}方法指定以前的数据格式:

marshal(DataFormat dataFormat)