2015-02-25 7 views
2

Я пытаюсь сгенерировать некоторый Java-класс из схемы XSD. Я точно знаю, что хочу создать на Java, и я пытаюсь написать соответствующую схему XSD.XSD to Java, указать использование Java HashMap

Мне нужно представить java.util.HashMap (HashMap). Я не могу найти, как указать в схеме XSD (или файл привязки xjb), что я хочу HasMap в Java. Он всегда генерировать список ..

здесь код, который я хочу, чтобы генерировать

@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> 

Но она по-прежнему продолжают генерировать java.util.List из mapEntry:

В моем классе «Ошибка»: protected Map details = new Map();

Вместо

protected java.util.Map<String, String> details = new HashMap<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», но компоненты этого имен не Referenceable из файла схемы документа »: //myFile.xsd. Если это неправильное пространство имен, возможно, необходимо изменить префикс «owi: hasmap». Если это правильное пространство имен, то соответствующий «импорт» тег должен быть добавлен в файл »: //myFile.xsd

И это не может ассоциировать„Owi: hasmap“к любому компоненту определения типа.

Любая идея?

+0

Проблема не в хэшмап-типе, скорее это ссылка на xsd, описывающая ее. Помогает ли это? http://stackoverflow.com/questions/12105840/xsd-syntax-for-xml-attributes-with-namespace – alkis

+0

Я также попытался импортировать пространство имен Oracle с помощью xsd: import, но все тот же результат (не может связывать owi : hashmap (или просто hashmap для определения любого типа). – hiveship

ответ

2

Да, карты обрабатываются без проблем jaxb, но только в одном направлении.

Решение описано здесь:

http://todayguesswhat.blogspot.co.uk/2012/09/jaxb-xsd-to-java-maphashmap-example.html

Но это много хлопот, если у вас уже есть класс, который отображает правильно.Почему вы хотите восстановить его из XSD?

Смежные вопросы