【问题标题】:Java Web Services/JAXB - Abstract superclassJava Web 服务/JAXB - 抽象超类
【发布时间】:2011-02-10 22:41:26
【问题描述】:

我有一个带有 JAXB 注释类和抽象超类的包。我想在 Web 服务接口中使用这个超类,所以我 可以将任何子类作为参数传递。当我这样做时,会引发异常:

javax.xml.ws.WebServiceException: javax.xml.bind.UnmarshalException
- with linked exception:
[javax.xml.bind.UnmarshalException: Unable to create an instance of xxx.yyy.ZZZ
- with linked exception:
[java.lang.InstantiationException]]

可以手动编组/解组并将参数作为字符串传递,但我想避免它。有什么想法吗?

【问题讨论】:

  • 对JAXB了解不多,但一定有原因,为什么不能创建实例。 xxx.yyy.ZZZ 有没有公开的无参数构造函数?
  • xxx.yyy.ZZZ 是已编组的实际对象的抽象超类的名称。不好的是,在解组时,jaxb 会尝试实例化这个超类,而不是被传递的对象的实际类。
  • xxx.yyy.ZZZ 在试图解组调用的系统/类路径中吗?
  • 肯定是这样,否则我猜会抛出不同的异常
  • 发布您的一些代码可能会有所帮助......这可能是注释语法的一些问题。否则,也许尝试使用接口而不是抽象超类?

标签: java web-services jaxb superclass


【解决方案1】:

我有一个类似的问题,上面的 cmets 没有解决。从InstantiationException during JAXB Unmarshalling (abstract base class, with @XmlSeeAlso concrete sub class) 链接的博客帖子对我了解我真正在做什么很有帮助。

【讨论】:

    【解决方案2】:

    我今天正在解决同样的问题。 我发现 EclipseLink MOXy JAXB 实现工作正常,但没有单独的 jar 或 maven 模块可用(它只是整个 eclipselink.jar,很大) 最后我尝试了最新的 JAXB 版本(2.2.2),令人惊讶的是它运行良好。

    Maven 配置:

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.2</version>
        </dependency>
    

    【讨论】:

    【解决方案3】:

    您是否在 Web 服务请求中指定了具体实现?这对我来说很好:

    抽象基类:

    @XmlSeeAlso({Foo.class, Bar.class})
    public abstract class FooBase
    {
      ...
    }
    

    实现类:

    @XmlRootElement(name = "foo")
    public class Foo extends FooBase
    {
      ...
    }
    

    Web服务方法:

    public String getFoo(@WebParam(name = "param") final FooBase foo)
    {
      ...
    }
    

    请求:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.example/">
       <soapenv:Header/>
       <soapenv:Body>
          <ser:getFoo>
             <param xsi:type="ser:foo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
          </ser:getFoo>
       </soapenv:Body>
    </soapenv:Envelope>
    

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 2015-07-23
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      相关资源
      最近更新 更多