开发者

Unable to get simple XmlAdapter to work

开发者 https://www.devze.com 2023-03-24 05:37 出处:网络
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'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 clas开发者_运维技巧s 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 XmlAdapter class 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.


You can refer to officail documentatio for XmlAdapter. They have given same example.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号