2016-05-09 15 views
0

Ich habe ein Objekt, das ich von einer REST-API im XML-Format zurückbekomme. Ich kann diesen Objekttyp erstellen und aktualisieren. In meinem Rest-Client möchte ich ein Attribut mit einigen meiner Elemente angeben. Nehmen wir an, ich kann ein Attribut wie access = "LOCKED" angeben, um dieses Feld in der Benutzerschnittstelle schreibgeschützt zu machen.So fügen Sie ein gemeinsames XML-Attribut mehreren Elementen hinzu

Beispiel: Benutzerobjekt

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "User") 
public class User { 

private String userName; 
private String userId; 
private String firstName; 
private String lastName; 
private String email; 

@XmlAttribute(name="username") 
public void setUserName(String userName) { 
    this.userName = userName; 
} 

@XmlAttribute(name = "userId", namespace = "some namespace") 
public void setUserId(String userId) { 
    this.userId = userId; 
} 

@XmlElement(name = "FirstName") 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

@XmlElement(name = "LastName") 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

@XmlElement(name = "Email") 
public void setEmail(String email) { 
    this.email = email; 
} 
} 

Marshalling mit JAXB:

User user = User.builder().email("[email protected]").userName("jd") 
     .userId("123").firstName("Jane").lastName("Doe").build(); 
JAXBContext jaxbContext = JAXBContext.newInstance(Iser.class); 
Marshaller marshaller = jaxbContext.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
marshaller.marshal(user, System.out); 

Unter der Annahme, dass ich den Zugang für E-Mail und Nachname festlegen möchten, Wie würden Sie dieses „Zugang mit Anmerkungen versehen "Attribut, um es auf jedes dieser Elemente zu setzen?

Erwartete Ausgabe mit dem Zugriffsattribut:

<User username="jd" ns:userId="123"> 
    <FisrtName>Jane</FirstName> 
    <LastName access="LOCKED">Doe</LastName> 
    <Email access="LOCKED">[email protected]</Email> 
</User> 
+0

Eine Lösung besteht darin, die Elemente selbst zu Objekten zu machen, und dann können sie eigene Attribute haben. Dies kommt jedoch mit viel doppeltem Code. – Saeed

Antwort

0

dieses versuchen

Beispiel: Benutzerobjekt

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlValue; 


@XmlRootElement(name = "User") 
public class User { 

private String userName; 
private String userId; 
private String firstName; 
private LastName lastName; 
private Email email; 


@XmlAttribute(name="username") 
public void setUserName(String userName) { 
    this.userName = userName; 
} 

@XmlAttribute(name = "userId", namespace = "some namespace") 
public void setUserId(String userId) { 
    this.userId = userId; 
} 

@XmlElement(name = "FirstName") 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

     @XmlRootElement(name = "LastName") 
     @XmlAccessorType (XmlAccessType.FIELD) 
    public static class LastName{ 
    @XmlValue 
    public String lastnme; 
    //put getters and setters 
    @XmlAttribute(name ="access") 
    public String access; 
    //put getters and setters 

    } 


    @XmlRootElement(name = "Email") 
     @XmlAccessorType (XmlAccessType.FIELD) 
    public static class Email{ 
    @XmlValue 
    public String Email_id; 
    //put getters and setters 
    @XmlAttribute(name ="access") 
    public String access; 
    //put getters and setters 

    } 

} 

mit JAXB Marshalling:

User.Lastname lastname = new User.Lastname(); 
lastname.setlastnme("Doe"); 
lastname.setAccess("LOCKED"); 

user.Email email_id = new user.Email(); 
email_id.setEmail_Id("[email protected]"); 
email_id.setAccess("LOCKED"); 

User user = User.builder().email(email_id).userName("jd") 
     .userId("123").firstName("Jane").lastName(lastname).build(); 

JAXBContext jaxbContext = JAXBContext.newInstance(Iser.class); 
Marshaller marshaller = jaxbContext.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
marshaller.marshal(user, System.out); 
+0

Dies funktioniert nicht. – Saeed

+0

änderte den Code mit neuen one.Pls versuchen. Schlagen Sie besser vor, wenn Sie über pls gekommen sind. – mattymanme