java JAXB解组无法正常工作
我试图使用JAXB
将XML转换为对象,我的XML如下所示:
<entityResource>
<Item xsi:type="objectPermissionImpl">
<permissionMask>0</permissionMask>
<permissionRecipient xsi:type="roleImpl">
<externallyDefined>false</externallyDefined>
<roleName>ROLE_USER</roleName>
</permissionRecipient>
<URI>repo:/public/adhoc/topics/JSDiagnosticTopic</URI>
</Item>
<Item xsi:type="objectPermissionImpl">
<permissionMask>0</permissionMask>
<permissionRecipient xsi:type="roleImpl">
<externallyDefined>false</externallyDefined>
<roleName>ROLE_ADMINISTRATOR</roleName>
</permissionRecipient>
<URI>repo:/public/adhoc/topics/JSDiagnosticTopic</URI>
</Item>
</entityResource>
所以我创建了3个java类:EntityResource。java,项目。java和PermissionRecipient。java,如下所示:
整个资源。java
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="entityResource")
public class EntityResource {
List<Item> ls_Item;
public EntityResource() {
}
public List<Item> getLs_Item() {
return ls_Item;
}
@XmlElement(name="Item")
public void setLs_Item(List<Item> ls_Item) {
this.ls_Item = ls_Item;
}
@Override
public String toString() {
return "EntityResource [ls_Item=" + ls_Item + "]";
}
}
项目。java
package model;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="Item")
public class Item {
int permissionMask;
List<PermissionRecipient> ls_permissionRecipient;
String URI;
public Item() {
}
public int getPermissionMask() {
return permissionMask;
}
@XmlElement(name="permissionMask")
public void setPermissionMask(int permissionMask) {
this.permissionMask = permissionMask;
}
public List<PermissionRecipient> getLs_permissionRecipient() {
return ls_permissionRecipient;
}
@XmlElement(name="permissionRecipient")
public void setLs_permissionRecipient(
List<PermissionRecipient> ls_permissionRecipient) {
this.ls_permissionRecipient = ls_permissionRecipient;
}
public String getURI() {
return URI;
}
@XmlElement(name="URI")
public void setURI(String uRI) {
URI = uRI;
}
@Override
public String toString() {
return "Item [permissionMask=" + permissionMask
+ ", ls_permissionRecipient=" + ls_permissionRecipient
+ ", URI=" + URI + "]";
}
}
许可接收人。java
package model;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="permissionRecipient")
public class PermissionRecipient {
String roleName;
boolean externallyDefined;
public PermissionRecipient() {
}
public boolean isExternallyDefined() {
return externallyDefined;
}
@XmlAttribute(name="externallyDefined")
public void setExternallyDefined(boolean externallyDefined) {
this.externallyDefined = externallyDefined;
}
public String getRoleName() {
return roleName;
}
@XmlAttribute(name="roleName")
public void setRoleName(String rolename) {
this.roleName = rolename;
}
@Override
public String toString() {
return "PermissionRecipient [externallyDefined=" + externallyDefined
+ ", roleName=" + roleName + "]";
}
}
所有的工作和我得到一个EntityResource对象包含该项,但是EntityResource的Item属性的permissionRecipient属性不包含他的属性(roleName和externallyDefined)
我的解组代码如下:
JAXBContext jaxbContext = JAXBContext
.newInstance(EntityResource.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
EntityResource resourceDescriptors = (EntityResource) jaxbUnmarshaller
.unmarshal(conn.getInputStream());// conn is an HttpURLConnection
项的toString()
函数返回以下结果:
[Item
[permissionMask=0,
permissionRecipient=PermissionRecipient [externallyDefined=false, roleName=null],
URI=repo:/public/adhoc/topics/JSDiagnosticTopic],
Item
[permissionMask=0,
permissionRecipient=PermissionRecipient [externallyDefined=false, roleName=null],
URI=repo:/public/adhoc/topics/JSDiagnosticTopic]]
因为你可以在每个项目中标记[externallyDefined=false, roleName=null]
,为什么?我犯了什么错误?如果这里有人能帮我解决问题,谢谢你,祝你好运
# 1 楼答案
用
@XmlAttribute
而不是@XmlElement
映射了roleName
和externallyDefined
调试提示
当对象模型没有按预期解组时,填充它并将其编组为XML,然后将输出与输入进行比较
# 2 楼答案
在我们的例子中,我们发现了一个不同的问题,即我们有一个xml标记,如
并定义了一个带有名称标记的java类。稍后,当我们尝试在java中使用它时,我们声明了如下所示的变量
和Java类,如下所示
取消编组不起作用,也没有加载值。我们将变量名从“tag”改为“tag”,宾果!成功了
另一个类似的情况是我们有标签名,比如
Java类为TagNew,变量名为TagNew,运行良好
也许我们仍然需要学习!这就是JaxB如何使用命名约定