问题描述
是的,jaxb可无缝处理地图,但只能以一种方式处理。
http://todayguesswhat.blogspot.co.uk/2012/09/jaxb-xsd-to-java-maphashmap- example.html
但是,如果您已经有一个可以正确映射的类,那就很麻烦了。为什么要从XSD重新生成它?
解决方法
我试图从XSD架构生成一些Java类。我确切地知道我想用Java生成什么,并且我正在尝试编写相应的XSD模式。
我需要代表一个java.util.HashMap(HashMap)。我找不到如何在XSD模式(或xjb绑定文件)中指定想要Java中的HasMap的方法。它总是生成一个列表。
在这里我要生成的代码
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ErrorMessage",propOrder = { "name","details"})
public class ErrorMessage {
@XmlElement(required = true)
protected String name;
@XmlElement(required = false)
protected java.util.Map<String,String> details = new HashMap<String,String>();
我已经试过了:
<xsd:complexType name="ErrorMessage">
<xsd:sequence>
<xsd:element name="name" type="xsd:string" />
<xsd:element name="details" type="map" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="map">
<xsd:sequence>
<xsd:element name="mapEntry" type="mapEntry" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="mapEntry">
<xsd:sequence>
<xsd:element name="key" type="xsd:string" />
<xsd:element name="value" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
但是它仍然继续生成mapEntry的java.util.List:
在我的“错误”类中:受保护的地图详细信息= new Map();
代替
protected java.util.Map<String,String>();
生成的“地图”类为:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "map",propOrder = {"mapEntry"})
public class Map {
protected List<MapEntry> mapEntry;
我确实需要为应用程序使用地图。关于我该怎么做的任何想法?
注意:我也尝试过使用Oracle
owi:hasmp,但是遇到了命名空间错误。
xmlns:owi="http://www.oracle.com/webservices/internal" (also tried with xmlns:owi="http://www.oracle.com/webservices/internal/literal")
包含在我的架构声明中
和我的“详细信息”元素声明如下
<xsd:element name="details" type="owi:hashmap" />
错误是:
src-resolve.4.2:解决组件’owi:hasmap’时出错。检测到“ owi:hasmap”在名称空间
“
http://www.oracle.com/webservices/internal
”中,但是该名称空间中的组件无法从架构文档“ file://myFile.xsd”中引用。如果这是不正确的名称空间,则可能需要更改“
owi:hasmap”的前缀。如果这是正确的名称空间,则应在“ file://myFile.xsd”中添加适当的“导入”标签。
而且它不能将“ owi:hasmap”关联到任何类型定义组件。
任何想法 ?