Java JAXB anyType无法强制转换

Java JAXB anyType无法强制转换,java,xml,soap,jaxb,Java,Xml,Soap,Jaxb,下面的代码导致了一个强制转换异常,我不知道为什么。ParameterValueList中的对象应该急切地解组到JAXB对象ParameterValueStruct,但事实并非如此。所有内容都是直接从soap编码和cwmp模式文件生成的 有人有什么建议吗 public static void main(String[] args) throws JAXBException, FileNotFoundException { JAXBContext c = JAXBContext.newIn

下面的代码导致了一个强制转换异常,我不知道为什么。ParameterValueList中的对象应该急切地解组到JAXB对象ParameterValueStruct,但事实并非如此。所有内容都是直接从soap编码和cwmp模式文件生成的

有人有什么建议吗

public static void main(String[] args) throws JAXBException, FileNotFoundException 
{
    JAXBContext c = JAXBContext.newInstance("org.dslforum.cwmp_1_1");

    Unmarshaller u = c.createUnmarshaller();
    Inform inform = (Inform) u.unmarshal(new FileInputStream("test.xml"));

    List<Object> list = inform.getParameterList().getAny();
    System.out.println(list); // prints [[ParameterValueStruct: null], ...

    for (Object o : list) {
        ParameterValueStruct pv = (ParameterValueStruct)o; // exception here
        System.out.println(pv.getName());
    }
}
第二个文件:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ParameterValueStruct", propOrder = {
    "name",
    "value"
})
public class ParameterValueStruct { 
    @XmlElement(name = "Name", required = true)
    protected String name;
    @XmlElement(name = "Value", required = true)
    @XmlSchemaType(name = "anySimpleType")
    protected Object value;
    ...
}
这是我的test.xml文件:

<?xml version="1.0"?>
<cwmp:Inform xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-1" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[3]">
    <ParameterValueStruct>
      <Name>Device.DHCPv4.ClientNumberOfEntries</Name>
      <Value xsi:type="xsd:unsignedInt">0</Value>
    </ParameterValueStruct>
    <ParameterValueStruct>
      <Name>Device.DNS.Client.ServerNumberOfEntries</Name>
      <Value xsi:type="xsd:unsignedInt">1</Value>
    </ParameterValueStruct>
    <ParameterValueStruct>
      <Name>Device.DeviceInfo.AdditionalSoftwareVersion</Name>
      <Value xsi:type="xsd:string">DM: 532,SK: 2.6.33.9-rt31,SF: 251X 137.0,BK: 10</Value>
    </ParameterValueStruct>
  </ParameterList>
</cwmp:Inform>

Device.DHCPv4.ClientNumberOfEntries
0
Device.DNS.Client.ServerNumberOfEntries
1.
Device.DeviceInfo.AdditionalSoftwareVersion
DM:532,SK:2.6.33.9-rt31,SF:251x137.0,BK:10

您只需将
@XmlRootElement(name=“ParameterValueStruct”,namespace=”“)
添加到
ParameterValueStruct

这里您需要显式的
namespace=“
,因为
package info.java

@javax.xml.bind.annotation.XmlSchema(namespace = "urn:dslforum-org:cwmp-1-1")
package org.dslforum.cwmp_1_1;
T正确的类应该是这样的:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ParameterValueStruct", propOrder = {
    "name",
    "value"
})
@XmlRootElement(name="ParameterValueStruct",namespace="")
public class ParameterValueStruct { 
    @XmlElement(name = "Name", required = true)
    protected String name;
    @XmlElement(name = "Value", required = true)
    @XmlSchemaType(name = "anySimpleType")
    protected Object value;
    ...
}

PS:有关
@xmlanyement(lax=true)

必须在您的建议中添加namespace=”“才能使其正常工作的更好的JAXB教程,请参见此。总共:@XmlRootElement(name=“ParameterValueStruct”,namespace=”“)@ComputerEngineer88我错过了为所有类设置名称空间的package-info.java,下面是更新的答案。我仍然不确定为什么需要指定空名称空间。有没有办法做到这一点,使得ParameterValueStruct可以像包中的其他类一样进行强制转换?Ie不必指定空名称空间?我不确定原因是什么,但它必须是
ParameterValueList extends Array
。您可以将ParameterValueList更改为不扩展数组,并拥有它自己的字段。
@javax.xml.bind.annotation.XmlSchema(namespace = "urn:dslforum-org:cwmp-1-1")
package org.dslforum.cwmp_1_1;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ParameterValueStruct", propOrder = {
    "name",
    "value"
})
@XmlRootElement(name="ParameterValueStruct",namespace="")
public class ParameterValueStruct { 
    @XmlElement(name = "Name", required = true)
    protected String name;
    @XmlElement(name = "Value", required = true)
    @XmlSchemaType(name = "anySimpleType")
    protected Object value;
    ...
}