java - JAXB 解码无法正常工作

标签 java xml jaxb unmarshalling

我正在尝试使用 JAXBXML 转换为对象,我的 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、Item.java 和 PermissionRecipient.java,如下所示:

EntityResource.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 + "]";
    }

}

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 + "]";
    }





}

PermissionRecipient.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 + "]";
    }


}

一切正常,我得到一个包含 Item 的 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

ItemtoString() 函数返回了这个结果:

[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],为什么?我犯了什么错误?谢谢,如果这里有人可以帮助我解决它,最好的问候。

最佳答案

您将 roleNameexternallyDefined 映射到 @XmlAttribute 而不是 @XmlElement

调试提示

当您的对象模型未按预期解码时,填充它并将其编码为 XML,然后将输出与您的输入进行比较。

关于java - JAXB 解码无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27658622/

相关文章:

java - JAXB,如何为具有元素重复属性的模式生成类

java - 在 Jaxb 中使用具有相同名称的不同标签进行解码

java - 从子类构造函数调用 super 构造函数是否会在内存中创建父类(super class)的对象?

java - 在 Java 应用程序中的特定文件夹下创建 SQLite 数据库

java - jersey json 尝试解码到同一对象

java - 为 JAXB 转换创建时间戳适配器

xml - Golang 解析带有同名嵌套节点的 XML?

java - JAXB:为什么如果我只设置某个值,该值会返回 null,而当我设置其他值时,会返回实际值?

java - Spring Boot 应用程序如何在内部工作?

java - 使用 JAXB 注释,当每个列表元素的名称未知时,如何获取包装在元素中的列表的每个 XML 元素?