2012-04-12 11 views
4

Könnte mir jemand helfen zu verstehen, warum ich immer diese Fehlermeldung:JAXB Fehler: unerwartetes Element, wenn unmarshalling

javax.xml.bind.UnmarshalException: unerwartetes Element (uri: "", local: "items") . Erwartete Elemente sind <

Ich habe neu bei JAX-B aber fest auf diesem den ganzen Tag, ich verstehe wirklich nicht, was passiert und jede Hilfe wird wirklich geschätzt, vielen Dank.

Klasse:

@XmlRootElement

public class Item { 

private String itemID; 
private String itemDescription; 

//need to have a constructor with no params 
public Item(){ 

} 

//Constructor: sets object vars 
public Item(String itemID, String itemDescription) { 

    this.itemID = itemID; 
    this.itemDescription = itemDescription; 
} 

@XmlAttribute 
//getters and setters 
public String getID() { 
    return itemID; 
} 

public void setId(String id) { 
    itemID= id; 
} 

@XmlElement 
public String getDescription() { 
    return itemDescription; 
} 

public void setDescription(String description) { 
    itemDescription = description; 
} 

Unmarshalling Code:

resource = client.resource("http://localhost:8080/testProject/rest/items"); 
    ClientResponse response= resource.get(ClientResponse.class); 
    String entity = response.getEntity(String.class); 

    System.out.println(entity); 

    JAXBContext context = JAXBContext.newInstance(Item.class); 
    Unmarshaller um = context.createUnmarshaller(); 
    Item item = (Item) um.unmarshal(new StringReader(entity)); 


And this is the XML i'm trying to parse: 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <items> 
     <item id="1"> 
     <description>Chinos</description> 
     </item> 
     <item id="2"> 
     <description>Trousers</description> 
     </item> 
</items> 

Hier ist die Web-Service, der die XML schafft:

@GET 
      @Produces(MediaType.TEXT_XML) 
      public List<Item> getItemsBrowser(){ 

       java.sql.Connection connection; 
       java.sql.Statement statement; 

       List<Item> items = new ArrayList<Item>(); 


       ResultSet resultSet = null; 

       try { 
        connection = dataSource.getConnection(); 
        statement = connection.createStatement(); 

        String query = "SELECT * FROM ITEMS"; 

        resultSet = statement.executeQuery(query); 

        // Fetch each row from the result set 
        while (resultSet.next()) { 
         String a = resultSet.getString("itemID"); 

         String b = resultSet.getString("itemDescription"); 

         //Assuming you have a user object 
         Item item = new Item(a, b); 

         items.add(item); 
        } 


       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


       return items; 
      } 
+0

Erzählen Sie uns mehr über Ihre Umgebung. Verschieben Sie Ihren neuen Code-Server? Welche Art von Webservice ist es (Java-Code zuerst (oder) WSDL zuerst)? – kosa

+0

Ich habe mit meinem Java RESTful Webservice Code aktualisiert – flexer7661

Antwort

4

Die Klasse Du erschaffst das J AXBContext from ist Item.class, aber das XML enthält eine Liste namens items, die wiederum eindeutige Item-Einträge enthält. Sie würden eine andere Klasse benötigen, die dafür sorgt, dass dies funktioniert.

Hier ist ein voll funktionierendes Beispiel:

Die Artikel Klasse:

import java.util.List; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Items { 

    private List<Item> items; 

    @XmlElement(name="item") 
    public List<Item> getItems() { 
     return items; 
    } 

    public void setItems(List<Item> items) { 
     this.items = items; 
    } 

} 

Beachten Sie, dass es eine @XmlElement Anmerkung auf dem Artikel Eigenschaft ist, da die tatsächlichen Elemente „Punkt“ in der XML genannt werden .

Die Item-Klasse:

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 

public class Item { 

    private String itemID; 
    private String itemDescription; 

    // need to have a constructor with no params 
    public Item() {} 

    public Item(String itemID, String itemDescription) { 
     this.itemID = itemID; 
     this.itemDescription = itemDescription; 
    } 

    @XmlAttribute 
    public String getId() { 
     return itemID; 
    } 

    public void setId(String id) { 
     itemID = id; 
    } 

    @XmlElement 
    public String getDescription() { 
     return itemDescription; 
    } 

    public void setDescription(String description) { 
     itemDescription = description; 
    } 
} 

Und ein Unit-Test:

import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertNotNull; 

import java.io.File; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 

import org.junit.Test; 

public class JAXBTest { 

    @Test 
    public void xmlIsUnmarshalled() throws JAXBException { 
     JAXBContext context = JAXBContext.newInstance(Items.class); 
     Unmarshaller um = context.createUnmarshaller(); 
     Items items = (Items) um.unmarshal(new File("items.xml")); 

     assertNotNull(items); 
     assertNotNull(items.getItems()); 
     assertEquals(2, items.getItems().size()); 

     assertEquals("Chinos", items.getItems().get(0).getDescription()); 
     assertEquals("Trousers", items.getItems().get(1).getDescription()); 

     assertEquals("1", items.getItems().get(0).getId()); 
     assertEquals("2", items.getItems().get(1).getId()); 
    } 
} 
+0

Danke, aber könnten Sie ein wenig mehr erraten? Ich muss diese Zeile bearbeiten? - JAXBContext Kontext = JAXBContext.newInstance (Item.class); – flexer7661

+0

Sicher, ich werde meine Antwort bearbeiten, um Code einzuschließen. – Rob

+0

Danke, das ist großartig, nur die Sache ist die Id ist null, wenn getestet. Die Beschreibung wird erhalten, aber nicht die ID, keine Ahnung, warum die ID für jedes Element null ist. Ich benutze "Items items = (Items) um.unmarshal (new StringReader (entity)) "; anstelle der XML-Datei Beispiel – flexer7661

0

Seit youa werden mit den Jersey cleint APIs Sie tun können, die folgenden und vermeiden die Items Klasse erstellen:

import java.util.List; 
import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.GenericType; 
import com.sun.jersey.api.client.WebResource; 

public class JerseyClient { 

    public static void main(String[] args) { 
     Client client = Client.create(); 
     WebResource resource = client.resource(""http://localhost:8080/testProject/rest/items""); 
     List<Item> items = resource.accept("application/xml").get(new GenericType<List<Item>>(){}); 
     System.out.println(items.size()); 
    } 

} 

Für weitere Informationen

Verwandte Themen