无法使用 SimpleXML 反序列化 SOAP 响应?
Cannot deserialize SOAP response using SimpleXML?
我正在开发一个用于与本地设备进行 UPnP 连接的库。
尝试解析来自其中一项操作的响应时,出现以下异常:
问题: 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:
响应信封:
@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;
}
}
非常感谢任何意见。
我会回答我自己的问题。我做了 3 处更改来解决此问题:
1).也映射了 encodyngStyle
,像这样:
@Attribute(name = "encodingStyle")
public String encodingStyle;
2).映射其他实体 不带前缀:
@Element(name = "Body")
private AssignedRolesResponseBody responseBody;
@Element(name = "GetAssignedRolesResponse")
private AssignedRolesResponseAction action;
3).映射 Action 的 root:
@Root(name = "u:GetAssignedRolesResponse")
@Namespace(reference = "urn:schemas-upnp-org:service:DeviceProtection:1", prefix = "u")
public class AssignedRolesResponseAction {}
我正在开发一个用于与本地设备进行 UPnP 连接的库。 尝试解析来自其中一项操作的响应时,出现以下异常:
问题: 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:
响应信封:
@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;
}
}
非常感谢任何意见。
我会回答我自己的问题。我做了 3 处更改来解决此问题:
1).也映射了 encodyngStyle
,像这样:
@Attribute(name = "encodingStyle")
public String encodingStyle;
2).映射其他实体 不带前缀:
@Element(name = "Body")
private AssignedRolesResponseBody responseBody;
@Element(name = "GetAssignedRolesResponse")
private AssignedRolesResponseAction action;
3).映射 Action 的 root:
@Root(name = "u:GetAssignedRolesResponse")
@Namespace(reference = "urn:schemas-upnp-org:service:DeviceProtection:1", prefix = "u")
public class AssignedRolesResponseAction {}