2013-10-22 15 views
8

Sto provando a generare la classe java dal file XSD, che contiene Map<String, Boolean. Ho letto il tutorial (http://todayguesswhat.blogspot.co.uk/2012/09/jaxb-xsd-to-java-maphashmap-example.html) che dice che devo usare Adapter e Binding per ottenere il risultato desiderato.XSD genera proprietà MAP <String, Boolean>

Ma per qualche motivo, dopo la generazione di proprietà è un List anziché il Map. Potresti per favore aiutarmi a capire il mio errore?

Grazie!

mio schema XSD:

<xs:element name="AutoCompleteReq"> 
    <xs:complexType> 
    <xs:sequence> 
    <xs:element name="queryString" type="xs:string"/> 
    <xs:element name="boostingFactors" type="test:StringBooleanMapModeller" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:complexType name="StringBooleanMapModeller"> 
    <xs:sequence> 
    <xs:element name="entry" minOccurs="0" maxOccurs="unbounded"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="key" type="xs:string"/> 
     <xs:element name="value" type="xs:boolean"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

Il mio file Binding:

<jaxb:bindings schemaLocation="AutoCompleteReq.xsd"> 

    <jaxb:bindings node="//xs:element[@name='AutoCompleteReq']//xs:element[@name='boostingFactors']"> 
    <jaxb:property> 
    <jaxb:baseType name="com.company.support.jaxb.StringBooleanMap&lt;String,Boolean&gt;" /> 
    </jaxb:property> 
    </jaxb:bindings> 

</jaxb:bindings> 

</jaxb:bindings> 

StringBooleanMap.java

package com.company.support.jaxb; 

import java.util.HashMap; 

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlJavaTypeAdapter(StringBooleanMapAdapter.class) 
public class StringBooleanMap<String, Boolean> extends HashMap<String, Boolean> { 

} 

StringBooleanMapAdapter.java

package com.company.support.jaxb; 

import java.util.HashMap; 
import java.util.Map; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

import com.company.xml.representation.StringBooleanMapModeller; 

public class StringBooleanMapAdapter extends XmlAdapter<StringBooleanMapModeller, HashMap<String, Boolean>> { 

    @Override 
    public HashMap<String, Boolean> unmarshal(StringBooleanMapModeller v) 
      throws Exception { 

     HashMap<String, Boolean> map = new HashMap<String, Boolean>(); 
     for(StringBooleanMapModeller.Entry e : v.getEntry()) 
     { 
      map.put(e.getKey(), e.isValue()); 
     } 

     return map; 
    } 

    @Override 
    public StringBooleanMapModeller marshal(HashMap<String, Boolean> v) 
      throws Exception { 

     StringBooleanMapModeller modeller = new StringBooleanMapModeller(); 
     for(Map.Entry<String, Boolean> entry : v.entrySet()) 
     { 
      StringBooleanMapModeller.Entry e = new StringBooleanMapModeller.Entry(); 
      e.setKey(entry.getKey()); 
      e.setValue(entry.getValue()); 
      modeller.getEntry().add(e); 
     } 
     return modeller; 
    } 
} 

pom.xml (pezzo per la generazione XSD)

<plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>jaxb2-maven-plugin</artifactId> 
       <version>1.3</version> 
       <executions> 
        <execution> 
         <id>Representations</id> 
         <configuration> 
          <schemaDirectory>XSD/Representation</schemaDirectory> 
          <packageName>com.company.xml.representation</packageName> 
          <bindingDirectory>XSD/Representation</bindingDirectory> 
          <outputDirectory>src/main/generated-sources</outputDirectory> 
          <staleFile>${project.build.directory}/generated-sources/jaxb/.representation</staleFile> 
          <clearOutputDir>false</clearOutputDir> 
         </configuration> 
         <goals> 
          <goal>xjc</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>Events</id> 
         <configuration> 
          <schemaDirectory>XSD/Representation/Event</schemaDirectory> 
          <packageName>com.company.xml.representation.event</packageName> 
          <bindingDirectory>XSD/Representation/Event</bindingDirectory> 
          <outputDirectory>src/main/generated-sources</outputDirectory> 
          <staleFile>${project.build.directory}/generated-sources/jaxb/.event</staleFile> 
          <clearOutputDir>false</clearOutputDir> 
         </configuration> 
         <goals> 
          <goal>xjc</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
+0

Potrebbe essere utile se si registra l'errore messaggio che stai ricevendo. Non dovrebbe essere possibile compilare il codice se stai richiedendo una mappa da un metodo che restituirà un elenco. – Bobulous

+0

Potrebbe essere un milione di cose. Assicurarsi che il file di bind termina con .xjb. Prova a eseguire manualmente il generatore jaxb e controlla se ricevi messaggi di errore migliori. Prova l'espressione xpath con qualche altro strumento. – KarlP

+0

La mia ipotesi iniziale sarebbe una directory di bind errata. Forse dovresti usare invece i "bindingFiles". Hai risolto il problema? – OmegaZiv

risposta

2

Rimuovere <String, Boolean> da dietro StringBooleanMap, non fa ciò che si pensa che sta facendo. String e Boolean sono interpretati come parametri generici, non come java.lang.String e java.lang.Boolean.

corretta:

package com.company.support.jaxb; 

import java.util.HashMap; 

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlJavaTypeAdapter(StringBooleanMapAdapter.class) 
public class StringBooleanMap extends HashMap<String, Boolean> { 

} 

Il codice è stato interpretato come:

public class StringBooleanMap<S,B> extends HashMap<S,B> { 

Inoltre, modificare il JAXB: BaseType riferimento a:

<jaxb:baseType name="com.company.support.jaxb.StringBooleanMap" /> 
Problemi correlati