Testdata.xml
<Users>
<User>
<Name>Ammu</Name>
<Books>
<Book>book1</Book>
<Book>book2</Book>
<Book>book3</Book>
</Books>
</User>
<User>
<Name>Unni</Name>
<Books>
<Book>book1</Book>
<Book>book2</Book>
<Book>book4</Book>
</Books>
</User>
</Users>
对外部服务的调用以上述XML格式返回数据, 我试图设计将此结构转换为POJO,以便使用JAXB将XML转换为POJO
问题: 当前输出:图书以空格式返回。为什么?
com.example.Users@45db05b2[
users=[com.example.User@2e530cf2[
name=Ammu
books=[]
], com.example.User@4e76fba0[
name=Unni
books=[]
]]
]
Book.java
import javax.xml.bind.annotation.XmlElement;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
public class Book {
private String name;
@XmlElement(name = "Book")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this,
ToStringStyle.MULTI_LINE_STYLE);
}
}
User.java
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
@XmlRootElement(name = "User")
public class User {
private String name;
private List<Book> books = new ArrayList<Book>();
@XmlElement(name = "Book", type = Book.class)
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
@XmlElement(name="Name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this,
ToStringStyle.MULTI_LINE_STYLE);
}
}
Users.java
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Users")
public class Users {
@XmlElement(name = "User", type = User.class)
private List<User> users = new ArrayList<User>();
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this,
ToStringStyle.MULTI_LINE_STYLE);
}
}
更新
在User.java中添加@XmlElementWrapper
后,取得了很大进展。
@XmlElementWrapper(name="Books")
@XmlElement(name = "Book")
public List<Book> getBooks() {
return books;
}
当前输出是,
com.example.Users@39b8d6f7[
users=[com.example.User@16290fbc[
name=Ammu
books=[com.example.Book@144aa0ce[
name=<null>
], com.example.Book@2f833eca[
name=<null>
], com.example.Book@518f5824[
name=<null>
]]
], com.example.User@61c80b01[
name=Unni
books=[com.example.Book@19e3cd51[
name=<null>
], com.example.Book@3abc8e1e[
name=<null>
], com.example.Book@311671b2[
name=<null>
]]
]]
但<book>
的值为空
更新2:最终
根据Blaise Doughan的更新,尝试添加@XmlValue
,这就是它......
在Book.java上不需要任何其他注释,[并且不需要Books.java,我曾经认为只需要声明Book的列表]。凉爽
public class Book {
private String name;
@XmlValue
public String getName() {
return name;
}
输出:
com.example.Users@3882764b[
users=[com.example.User@7d2452e8[
name=Ammu
books=[com.example.Book@6860991f[
name=book1
], com.example.Book@1de4f7c2[
name=book2
], com.example.Book@2345f0e3[
name=book3
]]
], com.example.User@5bbf3d87[
name=Unni
books=[com.example.Book@44c9d92c[
name=book1
], com.example.Book@1fd0fafc[
name=book2
], com.example.Book@510dc6b5[
name=book4
]]
]]
]
与其他地方的示例相比,这个用例略有不同。谢谢所有esp Blaise Doughan。
测试启动
public static void main(String[] args) {
try {
File file = new File("C:\\temp\\testdata.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Users.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Users users = (Users) jaxbUnmarshaller.unmarshal(file);
System.out.println(users);
} catch (Exception ex) {
ex.printStackTrace();
}
}
答案 0 :(得分:3)
您需要为您的用例使用@XmlElementWrapper
注释:
@XmlElementWrapper(name="Books")
@XmlElement(name = "Book")
public List<Book> getBooks() {
return books;
}
使用@XmlElementWrapper
,它会将XML写为:
<User>
<Books>
<Book>...</Book>
<Book>...</Book>
</Books>
</User>
没有它,预期的XML是:
<User>
<Book>...</Book>
<Book>...</Book>
</User>
在Book
课程中,您应使用name
为@XmlValue
媒体资源添加注释。
public class Book {
private String name;
@XmlValue
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
答案 1 :(得分:1)
使用数组时,对于用户示例,您使用@XmlRootElement(name =“Users”)进行映射,但对于Books,没有@XmlElement(name =“Books”,type = Book.class) ,你只是映射“书”。
尝试推杆:
@XmlElement(name = "Books", type = Book.class)
而不是:
@XmlElement(name = "Book", type = Book.class)