java - JAXB 无法处理接口(interface)——我错过了什么?

标签 java web-services jaxb

我正在使用 Jax-ws(或 JAXB,不确定,无论如何......)熟悉 Java 中的 Web 服务。

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

网络服务契约(Contract)

//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;
    }
}

当我发布网络服务时,出现以下错误:

Exception in thread "main" javax.xml.ws.WebServiceException: Unable to create JAXBContext...

Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions ITransferResult is an interface, and JAXB can't handle interfaces. this problem is related to the following location: at ITransferResult

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

我错过了什么?

最佳答案

您可能需要在 @SOAPBinding(style = Style.RPC) 的声明中将样式更改为 DOCUMENT 而不是 RPC

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

两种风格在hig​​h level上的区别如下

  • 文档:返回类型和方法参数在单独的 XSD 中清楚地解释了每种类型的详细信息 - 在自定义数据类型的情况下很有帮助(您的示例 ITransferResult java.util.List)。

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

关于java - JAXB 无法处理接口(interface)——我错过了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23196624/

相关文章:

java - Java Future多线程的正确实现

java - 我可以制作一个 "extends"@SuppressWarnings 的 Java 注释吗?

java - 在 hibernate (springboot)中使用左连接和分页编写 sql native 查询

c# - 没有证书的 WCF 身份验证

c# - WCF 混合身份验证用户名和 WIndows

java - Pojo 类(XML 到对象)

java - 我可以在 MOXy DynamicEntities 上设置空的嵌套值吗?

java - 数据更改问题

android - 使用 Realm for android 将 RealmList<Object> 设置为我的数据库项

java - "generic"用例的 JAXB 性能不佳 - 更好的设计模式?