I’m trying to get a XmlAdapter to a HashMap to work and I keep getting an exception. I followed this blog entry very closely, and I’ve been over my code many times yet I don’t see the issue.
I am using the latest version of org.eclipse.persistence.jaxb.JAXBContextFactory as my JAXB provider.
Here is a sample of my XML:
<test>
<myName>Paul</myName>
<mappings>
<entry key="man">manufacturer</entry>
<entry key="prod">product</entry>
</mappings>
<test>
Following the steps in the blog post mentioned above:
1. Identify the Unmappable Class
I’m trying to map a java.util.HashMap.
2. Create an Equivalent Class that is Mappable
public class MappingType
{
public List<MappingEntryType> entry = new ArrayList<MappingEntryType>();
}
public class MappingEntryType
{
@XmlAttribute
public String key;
@XmlValue
public String value;
}
3. Create an XmlAdapter to Convert Between Unmappable and Mappable Objects
public class MappingAdapter extends XmlAdapter<MappingType,
HashMap<String, String>>
{
@Override
public HashMap<String, String> unmarshal(MappingType v> throws Exception
{
HashMap<String, String> hashMap = new HashMap<String, String>();
for (MappingTypeEntry mappingEntry : v.entry)
{
hashMap.put(mappingEntry.key, mappingEntry.value);
}
return hashMap;
}
// marshal is here but I'm just working on unmarshalling now
}
4. Specify the XmlAdapter
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "test")
public class TestEntity
{
@XmlElement
private String myName;
@XmlJavaTypeAdapter(MappingAdapter.class)
HashMap<String, String> mappings;
// getters & setters omitted in a feeble attempt at brevity
}
I have added the next step, which I call
5. Stack Trace
Exception [EclipseLink-3001](Eclipse Persistence Services-2.3.0.v20110604-r9504):
org.eclipse.persistence.exceptions.ConversionException
ExceptionDescription: The object [mypackage.MappingType@145d424], of class
[class mypackage.MappingType],could not be converted to [class java.util.HashMap]
at etc etc
The exception description is very clear but I can’t see where I am trying to convert a MappingType to a HashMap. Sometimes typing a question leads me to the answer but not this time.
I’m sure it’s something simple – if you see my mistake please point it out!
Thanks!
By the way, Blaise Doughan’s blog is full of great JAXB and MOXy information, worth checking out.
I figured how to fix the issue, even if I don’t understand what was happening.
I am using the Spring framework with this project and my
XmlAdapterclass was marked as@Component. Removing that annotation made the code work perfectly. For some reason having my adapter managed by Spring prevented my JAXB provider from using the class to unmarshal my XML.