2011-05-05 3 views
1

Voici le problème. J'utilise Spring 3.0.4 pour créer un service Web de repos (et en fait je suis novice). Je souhaite conserver un objet via hibernate transmis par le client en tant que représentation XML. Pour accomplir cette tâche, j'utilise jaxb2.jaxb2Marshaller unmarshals XML dans un octet vide arra

L'objet que le client envoie est un noeud ayant deux objets sons, à savoir des données et des métadonnées. Le problème est que lorsque le client envoie son XML, le SIUserData est démasqué dans un tableau byte [] umpredictable: parfois une partie de l'imput est coupée et parfois elle est simplement vide.

par exemple cette entrée

<.SINode> 
    <.SIUserMeta>a lot of meta<./SIUserMeta> 
    <.SIUserData>BBB<./SIUserData> 
<./SINode> 

est unmarshalled dans un objet avec un attribut contenu StorageInterfaceData vide.

Je crois que le problème affecte la gestion de byte [] depuis que j'ai essayé de changer le type d'attribut de contenu StorageInterfaceData dans une fin de chaîne tout fonctionne bien: S.

Il suit le code.

noeud

@Entity 
@Table(name="sinode") 
@XmlRootElement(name="SINode") 
public class StorageInterfaceNode extends BulkObject implements Serializable{ 


    private Integer id; 
    private String name; 
    private StorageInterfaceMetadata metadata; 
    private StorageInterfaceData data; 

    public StorageInterfaceNode() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    public StorageInterfaceNode(Integer id, String name, StorageInterfaceMetadata metadata, 
      StorageInterfaceData data) { 
     super(); 
     this.id = id; 
     this.name = name; 
     this.metadata = metadata; 
     this.data = data; 
    } 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="id", unique=true, nullable=false) 
    @XmlTransient 
    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @XmlTransient 
    @Column(name="name", unique=true) 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    @OneToOne(cascade= CascadeType.ALL) 
    @XmlElement(name="SIUserMeta") 
    public StorageInterfaceMetadata getMetadata() { 
     return metadata; 
    } 
    public void setMetadata(StorageInterfaceMetadata metadata) { 
     this.metadata = metadata; 
    } 

    @OneToOne(cascade= CascadeType.ALL) 
    @XmlElement(name="SIUserData") 
    public StorageInterfaceData getData() { 
     return data; 
    } 
    public void setData(StorageInterfaceData data) { 
     this.data = data; 
    } 

} 

données

@Entity 
@Table(name="data") 
public class StorageInterfaceData extends BulkObject implements Serializable{ 


    private Integer id; 
    private String dataName; 
    private byte[] content; 

    public StorageInterfaceData() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    public StorageInterfaceData(byte[] content) { 
     super(); 
     this.content = content; 
    } 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="id", unique=true) 
    @XmlTransient 
    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @Column(name="name", unique=true, nullable=false) 
    @XmlTransient 
    public String getDataName() { 
     return dataName; 
    } 

    public void setDataName(String dataName) { 
     this.dataName = dataName; 
    } 

    @Column(name="content", nullable=false) 
    @XmlValue 
    public byte[] getContent() { 
     return content; 
    } 

    public void setContent(byte[] content) { 
     this.content = content; 
    } 
} 

bulkobject

@XmlTransient 
public class BulkObject { 

    private Integer id; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

} 
classe de métadonnées

est omi ne pas être trop verbeux. Quelqu'un peut-il effacer la chose s'il vous plaît?

Répondre

2

ok, je pense que je comprends. Je ne sais vraiment pas pourquoi, mais au cours de la procédure unmarshalling, JAXB2 suppose délibérément que le contenu de mes balises SIUserData est encodé en base64. J'ai fait mon test en écrivant du texte en clair et ce qui m'a été retourné était quelque chose d'insensé pour moi. Par exemple, j'ai écrit «beaucoup de données» (textuellement) dans les balises SIUserData et j'ai POSTé le nœud. Une fois que je l'ai récupéré, j'ai lu "alotofda" et ça m'a énervé. Je pourrais comprendre que les espaces blancs ont disparu mais pourquoi devrait-il couper le "ta" final ?! De mon point de vue, il y avait quelques problèmes dans la gestion des octets []. J'ai eu tort et voici comment ça se passe: Pour l'application "beaucoup de données" est une entrée encodée en base64. JAXB2 le gère en interne en effectuant un décodage et en obtenant "jZ-¡÷ Z". Quand je le demande avec un GET, JAXB2 effectue l'opération inverse en obtenant "alotofda". Le problème apparaît car "beaucoup de données" n'est pas une chaîne conforme à base64. La même chose se produit avec la chaîne "BBB" mentionnée plus haut dans la question. Si j'utilise de vraies données codées en base64, tout fonctionne parfaitement. C'est ma chance, puisque c'est comme ça que je dois gérer mes données. Juste pour être complet, quelqu'un sait comment gérer les données en XML en utilisant différents formats? Et comment surmonter ce comportement JAXB2?

Questions connexes