JAXB 无法处理接口 - 我错过了什么?

piz*_*cki 5 java web-services jaxb

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

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

网络服务合同

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

网络服务实现

//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;
    }
}
Run Code Online (Sandbox Code Playgroud)

TransferResult 合约

@XmlJavaTypeAdapter(TransferResult.class)
public interface ITransferResult {
    boolean isSuccessful();
    void setSuccessful(boolean successful);
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

线程“main”中的异常 javax.xml.ws.WebServiceException:无法创建 JAXBContext...

引起:java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions ITransferResult 是一个接口,JAXB 不能处理接口。 此问题与以下位置有关:在 ITransferResult

我已经查看了 SO 的答案并应用于最重复的提示,但没有一个对我有用。

我错过了什么?

Don*_*ows 1

看起来它没有将TransferResult类上的注释处理为可绑定元素。这意味着您可能需要添加@XmlSeeAlso(TransferResult.class)到接口 ( ITransferResult)。您还需要添加@XmlRootElement序列化实现 ( TransferResult),以便可以生成实际的 XML 文档,而不仅仅是在其他文档中使用的类型。这是因为,当 JAX-WS 实现创建其内部使用的 JAXB 上下文时,它仅使用您在服务接口上定义的参数和结果类型作为 的参数JAXB.newInstance(\xe2\x80\xa6);任何未字面列出的内容(或通过简单的方式找到)遵循类型即可找到的内容)都将被省略,并且完全有可能使用的类型适配器未针对注释进行处理(毕竟,它们不需要是它们所在接口的实例)适应,被适应的类型也不需要是接口)。

\n\n

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

\n\n
\n\n

警告:我不能 100% 确定这会起作用。如果没有,您将不得不改用具体类型(可能是直接 POJO)作为结果。这可能不是一件特别可口的事情,但至少很容易做到\xe2\x80\xa6

\n