我正在尝试让 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 信息,值得一试。