2

我正在尝试让 HashMap 的 XmlAdapter 工作,但我不断收到异常。我非常密切地关注这个博客条目,并且我已经多次检查我的代码但我没有看到问题。

我正在使用最新版本的org.eclipse.persistence.jaxb.JAXBContextFactory作为我的 JAXB 提供程序。

这是我的 XML 示例:

<test>
  <myName>Paul</myName>
  <mappings>
    <entry key="man">manufacturer</entry>
    <entry key="prod">product</entry>
  </mappings>
<test>

按照上面提到的博客文章中的步骤:

1. 识别不可映射的类

我正在尝试映射一个java.util.HashMap.

2. 创建一个可映射的等价类

public class MappingType
{
  public List<MappingEntryType> entry = new ArrayList<MappingEntryType>();
}

public class MappingEntryType
{
  @XmlAttribute
  public String key;
  @XmlValue
  public String value;
}

3. 创建一个 XmlAdapter 在不可映射对象和可映射对象之间进行转换

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. 指定 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
}

我添加了下一步,我称之为 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

异常描述非常清楚,但我看不到我试图将 a 转换MappingType为 a 的位置HashMap。有时输入一个问题会引导我找到答案,但这次不是。

我敢肯定这很简单-如果您发现我的错误,请指出!

谢谢!

顺便说一句,Blaise Doughan 的博客充满了很棒的 JAXB 和 MOXy 信息,值得一试。

4

2 回答 2

1

我想出了如何解决这个问题,即使我不明白发生了什么。

我在这个项目中使用 Spring 框架,我的XmlAdapter类被标记为@Component. 删除该注释使代码完美运行。出于某种原因,让我的适配器由 Spring 管理阻止了我的 JAXB 提供程序使用该类来解组我的 XML。

于 2011-08-02T03:09:07.577 回答
0

您可以参考 XmlAdapter 的官方文档。他们给出了同样的例子。

于 2012-06-06T05:51:55.467 回答