我有以下情况:
逻辑表达式有一个树结构,在我们的应用程序中使用,由四个类的hierarchie定义:
节点是一个抽象超类
OrNode 是表示OR的Node的子类
AndNode 是表示AND
的Node的子类
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]]
以下是我们添加的包装类和生成的类:
@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>
它是一个简单的树,由一个或一个节点和两个叶节点组成, treeInfo表示包含Node / tree对象的类以及其他一些信息。它被标记为带有相应注释的XmlRootElement。
我们错过了什么吗?
提前致谢!
答案 0 :(得分:2)
我发现了问题。我们正在使用几个Web服务,每个我们都通过wsimport生成包装类。一些web服务正在使用节点类。现在,正如我在我的问题中提到的,我们必须手动实现一些包装类,因为它们不是由wsimport自动生成的,即我们必须为OrNode和AndNode添加包装类。您还必须将XmlSeeAlso元素添加到超类中,以便它知道其子类。我们为一个Web服务添加了XmlSeeAlso元素,但是错过了另一个Web服务。这导致了上述异常。
答案 1 :(得分:1)
如果您正在开发中,快速解决方法是简单地从“abstract
”类的类定义中删除abstract
关键字。如果该类不再是abstract
,它将不再抛出错误。在将代码发布到生产环境之前,这可能是您想要解决的问题,但它可以使您在解决更深层次的问题之前继续开发应用程序的其他方面。
答案 2 :(得分:0)
假设您的SearchNode
类确实应该是Node
,那么您需要确保XML包含适当的xsi:type
属性以指定子类。
对于Leaf
类,它将是:
<node xsi:type="leaf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
</node>
了解更多信息