web-services - javax.xml.bind.UnmarshalException,无法创建类的实例

标签 web-services jaxb jax-ws

我有以下情况:

我们的应用程序中使用了逻辑表达式的树结构,并由四类层次结构定义:

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/

相关文章:

javascript - jQuery 和 Restful Web 服务安全

php - 智能手机应用程序的使用如何影响其网站版本排名?

java - 用户在 WebLogic 中无法通过身份验证

java - 包级别的 XmlJavaTypeAdapter 不起作用

java - 使用 JAXB Marshaller 处理 XML 转义字符(例如引号)

java - JAX-WS 线程安全

c# - 如何在不修改生成的类的情况下将 SoapExtension 属性添加到生成的 Web 服务客户端代理?

java - HyperJAXB 和 IDREF

java - 通过 HTTPS/SSL/TLS 的 JAX-WS Soap Web 服务客户端

java - 为什么 wsimport 在处理具有 @XmlRootElement 注释的服务器对象时遇到问题?