0

I defined two class to unmarshal the xml, but the result I get is always null;

@XmlRootElement(name="ValidateApiUserResponse", namespace="http://ops.net/AdminAPI_Admin")

public class ValidateApiUserResult extends OrionResponse {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private ValidateApiUserResponse validateApiUserResult;

@XmlElement(name = "ValidateApiUserResult", namespace = DataStructuresNS.VanguardAdminNS)
public ValidateApiUserResponse getValidateApiUserResult() {
    return validateApiUserResult;
}

public void setValidateApiUserResult(ValidateApiUserResponse validateApiUserResult) {
    this.validateApiUserResult = validateApiUserResult;
}

}

public class ValidateApiUserResponse implements java.io.Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private String[] claims;
private Boolean isValid;
private int[] validServerIds;

public ValidateApiUserResponse() {
}

public ValidateApiUserResponse(String[] claims, Boolean isValid, int[] validServerIds) {
       this.claims = claims;
       this.isValid = isValid;
       this.validServerIds = validServerIds;
}

@XmlElement(name = "Claims", namespace = DataStructuresNS.VanguardAdminNS)
public String[] getClaims() {
    return claims;
}

public void setClaims(String[] claims) {
    this.claims = claims;
}

@XmlElement(name = "IsValid", namespace = DataStructuresNS.VanguardAdminNS)
public Boolean getIsValid() {
    return isValid;
}

public void setIsValid(Boolean isValid) {
    this.isValid = isValid;
}

@XmlElement(name = "ValidServerIds", namespace = DataStructuresNS.VanguardAdminNS)
public int[] getValidServerIds() {
    return validServerIds;
}

public void setValidServerIds(int[] validServerIds) {
    this.validServerIds = validServerIds;
}

}

this is a namespace

public class DataStructuresNS {

public static final String VanguardAdminNS = "http://schemas.datacontract.org/2004/07/Admin.DataStructures";

}

then I try to unmarshal

String abc = "<ValidateApiUserResponse xmlns=\"http://ops.net/AdminAPI_Admin\">\n" +
    "         <ValidateApiUserResult xmlns:a=\"http://schemas.datacontract.org/2004/07/Admin.DataStructures\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
    "            <a:Claims xmlns:b=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">\n" +
    "               <b:string>Admin</b:string>\n" +
    "               <b:string>MANAGER</b:string>\n" +
    "            </a:Claims>\n" +
    "            <a:IsValid>true</a:IsValid>\n" +
    "            <a:ValidServerIds xmlns:b=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">\n" +
    "               <b:int>5001</b:int>\n" +
    "            </a:ValidServerIds>\n" +
    "         </ValidateApiUserResult>\n" +
    "      </ValidateApiUserResponse>";

    JAXBContext jaxbContext = JAXBContext.newInstance(ValidateApiUserResult.class);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

    ValidateApiUserResult root = (ValidateApiUserResult)unmarshaller.unmarshal(new StringReader(abc));

the root I get is null

Dean White
  • 49
  • 1
  • 3

2 Answers2

0

Try this for your root class :

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="ValidateApiUserResponse", namespace="http://ops.net/AdminAPI_Admin")
public class ValidateApiUserResult extends OrionResponse { ... }
Dimpre Jean-Sébastien
  • 1,067
  • 1
  • 6
  • 14
0

I define new class for array, and add type property in @XmlElement. for example:

private OrionString[] claims;

@XmlElement(name = "Claims", namespace = "xxxxx", type=OrionString.class)
public OrionString[] getClaims() {
    return claims;
}

this is the new class I defined

public class OrionString {

private String[] oString;

@XmlElement(name = "string", namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays")
public String[] getoString() {
    return oString;
}

public void setoString(String[] oString) {
    this.oString = oString;
}

}

Dean White
  • 49
  • 1
  • 3