2016-12-07 104 views
1

我正在研究與本地設備進行UPnP連接的庫。 我得到下面的異常,試圖解析從操作的一個響應時:無法使用SimpleXML反序列化SOAP響應?

問題:org.simpleframework.xml.core.ValueRequiredException: Unable to satisfy @org.simpleframework.xml.Element(data=false, name=s:Body, required=true, type=class com.stuff.AssignedRolesResponseBody) on field 'responseBody' private com.stuff.AssignedRolesResponseBody com.stuff.AssignedRolesResponseEnvelope.responseBody for class com.stuff.AssignedRolesResponseEnvelope at line 1

原始響應,我試圖解析:

<?xml version="1.0"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <s:Body> 
     <u:GetAssignedRolesResponse xmlns:u="urn:schemas-upnp-org:service:DeviceProtection:1"> 
      <RoleList>{something_here?}</RoleList> 
     </u:GetAssignedRolesResponse> 
    </s:Body> 
</s:Envelope> 

這些是我的POJO:

ResponseEnvelope:

@Root(name = "s:Envelope") 
@NamespaceList({ 
     @Namespace(prefix = "s", reference = "http://schemas.xmlsoap.org/soap/envelope/") 
}) 
public class AssignedRolesResponseEnvelope extends XMLBaseResponse { 

    @Element(name = "s:Body", type = AssignedRolesResponseBody.class)//I tried without specifiying the type here - no difference 
    private AssignedRolesResponseBody responseBody; 

    public AssignedRolesResponseBody getResponseBody() { 
    return responseBody; 
    } 

    public void setResponseBody(AssignedRolesResponseBody responseBody) { 
    this.responseBody = responseBody; 
    } 
} 

身體:

public class AssignedRolesResponseBody { 

    @Element(name = "u:GetAssignedRolesResponse") 
    @NamespaceList({ 
      @Namespace(prefix = "u", reference = "urn:schemas-upnp-org:service:DeviceProtection:1") 
    }) 
    private AssignedRolesResponseAction action; 

    public AssignedRolesResponseAction getAction() { 
    return action; 
    } 

    public void setAction(AssignedRolesResponseAction action) { 
    this.action = action; 
    } 
} 

操作:

public class AssignedRolesResponseAction { 

    @Element(name = "RoleList") 
    List<String> roleList; 

    public List<String> getRoleList() { 
    return roleList; 
    } 

    public void setRoleList(List<String> roleList) { 
    this.roleList = roleList; 
    } 
} 

任何輸入是非常讚賞。

回答

0

我會回答我自己的問題。我做了3個修改來解決這個問題:

1)。也映射了encodyngStyle,如下所示:

@Attribute(name = "encodingStyle") 
    public String encodingStyle; 

2)。映射到其他實體沒有前綴:

@Element(name = "Body") 
    private AssignedRolesResponseBody responseBody; 

    @Element(name = "GetAssignedRolesResponse") 
    private AssignedRolesResponseAction action; 

3)。映射行動

@Root(name = "u:GetAssignedRolesResponse") 
@Namespace(reference = "urn:schemas-upnp-org:service:DeviceProtection:1", prefix = "u") 
public class AssignedRolesResponseAction {}