XMLAdapter for list not working [message #1847351] |
Mon, 25 October 2021 00:28  |
C. Stuart Hardwick Messages: 1 Registered: October 2021 |
Junior Member |
|
|
I just cannot get the XMLAdapter to work where a collection of name/value pairs is required. I have a large application which I am converting FROM Castor TO Moxy, so I am mostly stuck with the classes I have, though I've refactored out the non-static inner classes. Things are working okay except until...
When it comes to an object with properties, I need to serialize the properties as name/value pairs something like this: <property key="File" value="classpath:tufts\sds\startup.sds"/>
Simple enough. The data is coming (probably with unnecessary complexity) from a deep, ugly custom class I don't want to mess with, and Moxy ignores it during marshalling. This shouldn't be a problem, it's what the XMLAdapter is for, right?
But...I can't get that to work--at all. Depending on how I set things, I can get a string or I can get nothing. I never get the xml I expect.
When I call the Marshal method on my adapter, it works in that it fetches all my property values and populates a nice simple Arraylist, but the data in that arraylist is not written out to my export file with the rest of the marshalling output.
//The XML ADAPTER====================================
package tufts.sds;
import jakarta.xml.bind.annotation.adapters.XmlAdapter;
public class MarshallingMetaMapAdapter extends XmlAdapter<MarshallingMyMapStringType,MetaMap> {
@Override
public MarshallingMyMapStringType marshal(MetaMap v) throws Exception {
MarshallingMyMapStringType myMap = new MarshallingMyMapStringType();
// Works (populates myMap.Items), but emits empty node in xml output
// for(Entry<String, Object> entry : v.getPersistEntries()) {
// MarshallingMyStringEntryType myMapEntryType = new MarshallingMyStringEntryType();
// myMapEntryType.key = entry.getKey();
// myMapEntryType.value = "DONKEY"; //entry.getValue();
// myMap.items.add(myMapEntryType);
// }
MarshallingMyStringEntryType myItem= new MarshallingMyStringEntryType();
myItem.key="A";
myItem.value="1";
myMap.items.add(myItem);
return myMap;
// Use with List<String> returns everything as one string, no elements.
// emailAddresses.add("donkey=fool");
// emailAddresses.add("~");
// emailAddresses.add("newt=weaslefool");
// return emailAddresses;
// Emits string, but not with usable xml node wrappers.
// return "<YANKEE>Doodle</YANKEE><YANKEE>dandy</YANKEE>"; //myMap;
}
@Override
public MetaMap unmarshal(MarshallingMyMapStringType arg0) throws Exception {
return null;
// MetaMap<Integer, String> hashMap = new HashMap<Integer, String>();
// for(MarshallingMyMapEntryType myEntry : arg0.entry) {
// hashMap.put(myEntry.key, myEntry.value);
// }
// return hashMap;
}
}
//THE ARRAYLIST (which should be mappable)
public class MarshallingMyMapStringType {
MarshallingMyMapStringType(){
}
public List<MarshallingMyStringEntryType> items = new ArrayList<MarshallingMyStringEntryType>();
}
//THE ENTRY TYPE (Which should also be mappable)
public class MarshallingMyStringEntryType {
MarshallingMyStringEntryType(){
}
@XmlAttribute
public String key;
@XmlValue
public String value;
}
No matter what I try, it doesn't work. I can populate the arraylist, but it isn't written out. I can populate a List<string> but it isn't written as XML (all content of all elements is written as a single string). The only thing that works is, if I reconfigure to return a string. it writes out that string. I suppose I could manually marshall and unmarshall into csv or something for just these property lists to get around this, but that's an aweful kludge.
Here's the binding file entry that tells moxy to use the adapter. It seems to work correctly.
<xml-java-type-adapter value="tufts.sds.MarshallingMetaMapAdapter" type="tufts.sds.MetaMap" />
Also from the bindings file, here's the object reference I'm currently stuck on. All attribs & elements work except "Properties" which is a list of name/value data. When it writes anything at all, it writes it inside the propertylist tag. When it does't,it leaves that tag empty or omits it entirly.
Surely I must be doing something very wrong, but I just can't see what it is, and at this point I'm just making things worse for playing with the code, hoping some experiment reveals the magic.
Help!
Thanks.
|
|
|
|
Powered by
FUDForum. Page generated in 0.02226 seconds