2017-09-20 7 views
0

속성을 JSON으로 반환하지만 올바른 순서가 아닌 Camel이있는 끝점이 있습니다. 반환 클래스에는 모든 반환시 반드시 있어야하는 일부 컨트롤 데이터를 반환하는 수퍼 클래스가 있습니다.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 구문에서는 사용할 수 없습니다. 시도했지만 결과가 없습니다 :

이러한 유형의 serializer를 사용하여 Jackson으로 마이그레이션하지 않고 올바른 순서를 유지할 수 있습니까?

참고 : serializer의 코드 (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(); 

을 만들기 이전에 만든 Gson 예를 지정하여 새로운 GsonDataFormat :

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

RouteBuildermarshal(DataFormat dataFormat)의 이전 데이터 형식을 지정을 방법 :

.marshal(gsonDataFormat) 
+0

감사합니다. 그것은 적절한 순서로 예상되는 응답을주는 일을했습니다. –