我有以下情况:
在我们的应用程序中使用了一个逻辑表达式的树结构,该结构由一个四类层次结构定义:
节点是一个抽象的父类(super class)
OrNode是表示OR的Node的子类
AndNode是Node的子类,代表AND
Leaf是Node的子类,代表拥有一些数据的叶子节点
现在,应该将树结构传输到Web服务,该服务将对树进行一些操作(例如,通过收集其他信息来评估结果)
该WS-Operation的签名如下所示:
public TheResult evaluateTree(Node tree);
我们正在使用JAX-WS并使用wsimport生成Web服务类。首先,没有为OrNode,AndNode和Leaf生成任何类。因此,我们手动添加了它们。我们将客户端使用的类转换为wsimport创建的生成的类。接下来,我们要使用转换后的树作为参数来调用Web服务操作。但是这里发生了一个异常,例如:
javax.xml.ws.soap.SOAPFaultException: javax.xml.bind.UnmarshalException - with linked exception: [javax.xml.bind.UnmarshalException: Unable to create an instance of InterfaceEntities.Node - with linked exception: [java.lang.InstantiationException]]
这是我们添加的Wrapper类和生成的类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "OrNode")
public class OrNode
extends Node
{
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AndNode")
public class AndNode
extends Node
{
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "leaf")
public class Leaf
extends Node
{
...
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "node", propOrder = {
"children",
"resultSet",
})
@XmlSeeAlso({
Leaf.class,
OrNode.class,
AndNode.class
})
public abstract class Node {
...
}
编辑:
这是使用Blaise Doughan博客中所述的
Marshaller
时生成的XML文件(请参见下面的答案):<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:treeInfo xmlns:ns2="http://webservice.api.process/">
<tree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:OrNode">
<children xsi:type="ns2:leaf">
<!-- some fields holding values -->
</children>
<children xsi:type="ns2:leaf">
<!-- some fields holding values -->
</children>
</tree>
<!-- some fields holding values -->
</ns2:treeInfo>
它是由一个orNode和两个叶节点组成的简单树,
treeInfo表示包含Node/tree对象以及其他信息的类。它带有相应的注释标记为XmlRootElement。
我们错过了什么吗?
提前致谢!
最佳答案
我发现了问题。我们正在使用几个Web服务,对于每个服务,我们都通过wsimport生成包装器类。一些Web服务正在使用节点类。现在,正如我在问题中提到的那样,我们必须手动实现一些包装器类,因为它们不是由wsimport自动生成的,即我们必须为OrNode和AndNode添加包装器类。您还必须将XmlSeeAlso元素添加到父类(super class),以便它知道其子类。我们为一个Web服务添加了XmlSeeAlso元素,但为另一个Web服务错过了它。这导致了上面提到的异常。
关于web-services - javax.xml.bind.UnmarshalException,无法创建类的实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20076474/