基于类字段的根名称,用于带有jackson的xml序列化对象

时间:2017-08-10 05:48:20

标签: java json xml spring serialization

首先,我要事先感谢你的帮助!

让我解释一下我目前的问题:

我正在尝试使用rest / json / swagger层包装一些旧的Web服务调用。事实上,那些旧服务使用了一种棘手的私有xml格式,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<service_RegistroEventoSrv>      
  <inputMap type="map">
      <mensajeMT type="map">
          <identificador type="String">
              <_value_>USUPRUEBA</_value_>
          </identificador>
          <modo type="String">
            <_value_>1</_value_>
         </modo>

      </mensajeMT>

    </inputMap>
</service_RegistroEventoSrv>

我已经能够序列化大多数对象和字段,但是我对root标签有问题。用于序列化的主类是以下类,但我需要root标记从“serviceId”属性获取其值

public class CafRequestObject<I,O> {
    private String serviceId;
    private I inputMap;
    private O outputMap;
    private RequestMetaInfo requestMetaInfo;
    private ResponseMetaInfo responseMetaInfo;
 ... getters and setters
}

为了实现这种棘手的自定义序列化,我在jackson XmlMapper中为spring rest模板添加了一些serializares。

CafRequestObjectSerializer

 public class CafRequestObjectSerializer  extends CafXsdSerializer<CafRequestObject> {
 public void serialize(CafRequestObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
         final ToXmlGenerator xgen = (ToXmlGenerator) jgen;


         xgen.writeStartObject();
         addRequestMetaInfo(value.getRequestMetaInfo(),xgen);        
         addObject(value.getInputMap(), xgen,INPUT_MAP);         
         xgen.writeEndObject();

}    

   }

有没有办法从字段值中获取根名称?这在我的情况下是强制性的,因为每个调用必须具有不同的根值(因此我不能使用JsonRootName或XmlRootName)

提前多多感谢!

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。也许它不是最好的,但至少对我有用:)

我扩展了jackson的类XmlSerializerProvider和覆盖方法

serializeValue

有一节代码可以执行以下操作:

QName rootName = _rootNameFromConfig();
        if (rootName == null) {
            rootName = _rootNameLookup.findRootName(cls, _config);
        }

我已经修改了它的原始行为,以便根据我的根类的字段改变它获取根标记的方式:

 QName rootName = _rootNameFromConfig();
        if (rootName == null) {
            if (value instanceof CafRequestObject){
                rootName= getRootNameFromServiceId((CafRequestObject)value);
            }
            else{
                rootName = _rootNameLookup.findRootName(cls, _config);  
            }

        }


protected QName getRootNameFromServiceId(CafRequestObject object){
     return new QName( object.getServiceId()+_SERVICE);
}

感谢您的帮助!