无法让简单的 XmlAdapter 工作
我试图让 XmlAdapter 到 HashMap 工作,但我不断收到异常。我非常密切地关注这篇博客文章,并且我'我已经检查过我的代码很多次了,但我没有看到问题。
我使用最新版本的 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.堆栈跟踪
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
异常描述非常清楚,但我看不到我在哪里尝试将 MappingType
转换为 HashMap
。有时输入问题会让我找到答案,但这次不行。
我确信这很简单 - 如果您看到我的错误,请指出!
谢谢!
顺便说一句,Blaise Doughan 的博客充满了精彩的 JAXB 和 MOXy 信息,值得一读。
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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我想出了如何解决这个问题,即使我不明白发生了什么。
我在这个项目中使用 Spring 框架,并且我的
XmlAdapter
类被标记为@Component
。删除该注释使代码可以完美运行。由于某种原因,我的适配器由 Spring 管理,导致我的 JAXB 提供程序无法使用该类来解组我的 XML。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.您可以参考官方文档 XmlAdapter。他们给出了同样的例子。
You can refer to officail documentatio for XmlAdapter. They have given same example.