我有以下情况:
我们的应用程序中使用了逻辑表达式的树结构,并由四类层次结构定义:
Node 是一个抽象的父类(super class)
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]]
以下是我们添加的 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 {
...
}
编辑:
这是使用
Marshaller
时生成的 XML 文件如 Blaise Doughan 的博客所述(见下面的回答):<?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 为每个服务生成包装类。一些网络服务正在使用节点类。现在,正如我在我的问题中提到的,我们必须手动实现一些包装类,因为它们不是由 wsimport 自动生成的,即我们必须为 OrNode 和 AndNode 添加包装类。您还必须将 XmlSeeAlso 元素添加到父类(super class),以便它知道其子类。我们为一项 Web 服务添加了 XmlSeeAlso 元素,但在另一项服务中没有添加。这导致了上面提到的异常。
关于web-services - javax.xml.bind.UnmarshalException,无法创建类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076474/