Java JAXB错误:解组时出现意外元素

Java JAXB错误:解组时出现意外元素,java,jaxb,jersey,jax-rs,Java,Jaxb,Jersey,Jax Rs,有人能帮我理解为什么我会出现这个错误吗: javax.xml.bind.UnmarshaleException:意外元素(uri:,local:“items”)。预期的要素是 我刚接触JAX-B,但整天都在这上面,我真的不知道发生了什么,非常感谢您的帮助,非常感谢 项目类别: @XmlRootElement public class Item { private String itemID; private String itemDescription; //need to have a c

有人能帮我理解为什么我会出现这个错误吗:

javax.xml.bind.UnmarshaleException:意外元素(uri:,local:“items”)。预期的要素是

我刚接触JAX-B,但整天都在这上面,我真的不知道发生了什么,非常感谢您的帮助,非常感谢

项目类别:

@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;
}
解组代码:

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>
resource=client.resource(“http://localhost:8080/testProject/rest/items");
ClientResponse-response=resource.get(ClientResponse.class);
String entity=response.getEntity(String.class);
系统输出打印项次(实体);
JAXBContext context=JAXBContext.newInstance(Item.class);
Unmarshaller um=context.createUnmarshaller();
Item Item=(Item)um.unmarshal(新StringReader(实体));
这就是我试图解析的XML:
斜纹棉布裤
裤子
以下是创建XML的Web服务:

@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;
            }
@GET
@生成(MediaType.TEXT\u XML)
公共列表getItemsBrowser(){
java.sql.Connection;
java.sql.Statement语句;
列表项=新建ArrayList();
ResultSet ResultSet=null;
试一试{
connection=dataSource.getConnection();
statement=connection.createStatement();
String query=“从项目中选择*”;
resultSet=语句.executeQuery(查询);
//从结果集中获取每一行
while(resultSet.next()){
字符串a=resultSet.getString(“itemID”);
字符串b=resultSet.getString(“itemDescription”);
//假设您有一个用户对象
项目=新项目(a、b);
项目。添加(项目);
}
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
退货项目;
}

创建JAXBContext的类是Item.class,但XML包含一个名为items的列表,而items又包含不同的项条目。您需要另一个类来包装

List<Item>
和单元测试:

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());
    }
}

由于您使用的是Jersey cleint API,因此可以执行以下操作并避免创建
类:

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());
    }

}
import java.util.List;
导入com.sun.jersey.api.client.client;
导入com.sun.jersey.api.client.GenericType;
导入com.sun.jersey.api.client.WebResource;
公共类运动衫客户{
公共静态void main(字符串[]args){
Client=Client.create();
WebResource=client.resource(“”)http://localhost:8080/testProject/rest/items"");
List items=resource.accept(“application/xml”).get(new-GenericType(){});
System.out.println(items.size());
}
}
了解更多信息


告诉我们有关您的环境的更多信息。您是否正在将代码移动到新服务器?它是什么类型的Web服务(java代码优先(或WSDL优先)?我已经用我的java RESTful Web服务代码进行了更新谢谢,但是你能再简单一点吗?我需要编辑这行吗JAXBContext context=JAXBContext.newInstance(Item.class);谢谢,这很好,唯一的问题是测试时Id为空。正在获取描述而不是Id,知道为什么每个项目的Id为空吗?我使用“Items=(Items)um.unmarshal(newstringreader(entity))”;与您的xml文件示例Stratch不同的是,这是一个大写字母的问题,谢谢您的回答我也偶然发现了这一点,忘了告诉您-在我的代码示例中,您可以看到我将getID()重命名为getID():-)FYI-因为@flexer7661正在使用Jersey客户端API,下面是一种仍然可以利用JAXB绑定的方法,但避免使用
类:
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());
    }
}
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());
    }

}