首先,我要事先感谢你的帮助!
让我解释一下我目前的问题:
我正在尝试使用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。
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)
提前多多感谢!
答案 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);
}
感谢您的帮助!