JAXB无法处理接口 - 我缺少什么?

时间:2014-04-21 11:36:57

标签: java web-services jaxb

我使用Jax-ws熟悉Java中的Web服务(或JAXB,不管怎样,不管怎样......)。

我用一个网络服务创建了一个小项目。 WS具有唯一的端点,称为transfer,并返回继承ITransferResult接口的对象。

网络服务合约

//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface IBankWebSrv {
    @WebMethod
    ITransferResult transfer(String accountNumber, double amount);
}

网络服务实施

//Service Implementation
@WebService(endpointInterface = "Contracts.IBankWebSrv")
public class BankWebSrv implements IBankWebSrv {
    @Override
    public ITransferResult transfer(String accountNumber, double amount) {
        ITransferResult result = new TransferResult();
        // TODO logic here
        result.setSuccessful(true);
        return result;
    }
}

TransferResult合同

@XmlJavaTypeAdapter(TransferResult.class)
public interface ITransferResult {
    boolean isSuccessful();
    void setSuccessful(boolean successful);
}

TransferResult实施

public class TransferResult extends XmlAdapter<TransferResult, ITransferResult>
        implements ITransferResult {

    @XmlElement
    boolean successful;

    public boolean isSuccessful() {
        return this.successful;
    }

    public void setSuccessful(boolean successful) {
        this.successful = successful;
    }

    @Override
    public TransferResult marshal(ITransferResult v) throws Exception {
        return (TransferResult) v;
    }

    @Override
    public ITransferResult unmarshal(TransferResult v) throws Exception {
        return (ITransferResult) v;
    }
}

当我发布我的网络服务时,我收到以下错误:

  

线程中的异常&#34; main&#34; javax.xml.ws.WebServiceException:无法执行   创建JAXBContext ...

     

引起:java.security.PrivilegedActionException:   com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1   IllegalAnnotationExceptions的计数 ITransferResult是一个接口,   并且JAXB无法处理接口。这个问题与之相关   以下位置:在ITransferResult

我已经查看了SO的答案并应用了最重复的提示,但它们都没有为我工作。

我错过了什么?

2 个答案:

答案 0 :(得分:4)

您可能需要在@SOAPBinding(style = Style.RPC)

的声明中将样式更改为 DOCUMENT 而不是 RPC

虽然这是一个老问题,但我认为我会回答它,因为它是人们遇到的常见例外。

高级别中两种风格的区别如下

  • 文档:返回类型和方法参数在单独的XSD中清楚地解释,每种类型都有详细说明 - 在自定义数据类型的情况下很有用(例如{{1} }或ITransferResult)。

  • RPC :这些类型以简单的方式在WSDL中定义。

答案 1 :(得分:0)

看起来它并没有将TransferResult类上的注释作为可绑定元素进行处理。这意味着您可能需要将@XmlSeeAlso(TransferResult.class)添加到界面(ITransferResult)。您还需要将@XmlRootElement放在序列化实现(TransferResult)上,以便生成实际的XML文档,而不仅仅是您在其他文档中使用的类型。这是因为当JAX-WS实现创建它在内部使用的JAXB上下文时,它只使用您在服务接口上定义的参数和结果类型作为JAXB.newInstance(…)的参数;那些字面上没有列出的东西(或者可以通过简单找到类型之后的东西)将被省略,并且完全有可能所使用的类型适配器不会被处理用于注释(毕竟,它们不是&# 39; t需要是他们适应的界面的实例,被调整的类型也不需要是一个界面。

(是的,SOAP响应是一个封闭文档,但推荐使用它的方法是将单个元素放在SOAP Body中,这意味着您需要知道name的元素。这意味着@XmlRootElement注释。)


警告:我不能100%确定这会有效。如果它没有,你将不得不切换到使用具体类型(可能是直接的POJO)作为结果。它可能不是特别可口的东西,但它至少很容易做到......