有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JAXB解组无法正常工作

我试图使用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,项目。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],为什么?我犯了什么错误?如果这里有人能帮我解决问题,谢谢你,祝你好运


共 (2) 个答案

  1. # 1 楼答案

    @XmlAttribute而不是@XmlElement映射了roleNameexternallyDefined

    调试提示

    当对象模型没有按预期解组时,填充它并将其编组为XML,然后将输出与输入进行比较

  2. # 2 楼答案

    在我们的例子中,我们发现了一个不同的问题,即我们有一个xml标记,如

    <tag></tag> 
    

    并定义了一个带有名称标记的java类。稍后,当我们尝试在java中使用它时,我们声明了如下所示的变量

    Tag tag; //didn't worked
    

    和Java类,如下所示

    @XmlRootElement(name = "Tag")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "Tag", propOrder = {
    
    })
    public class Tag{}
    

    取消编组不起作用,也没有加载值。我们将变量名从“tag”改为“tag”,宾果!成功了

    Tag Tag; //worked
    

    另一个类似的情况是我们有标签名,比如

    <tagNew></tagNew>
    

    Java类为TagNew,变量名为TagNew,运行良好

    @XmlRootElement(name = "TagNew")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "TagNew", propOrder = {
    
    })
    public class TagNew{}
    
    TagNew tagNew; // worked fine
    

    也许我们仍然需要学习!这就是JaxB如何使用命名约定