Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB无法处理接口-我缺少什么?_Java_Web Services_Jaxb - Fatal编程技术网

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

Java JAXB无法处理接口-我缺少什么?,java,web-services,jaxb,Java,Web Services,Jaxb,我越来越熟悉使用Jax-ws(或者JAXB,无论如何也不确定…)的Java中的web服务 我用一个Web服务创建了一个小项目。WS具有唯一名为transfer的端点,并返回继承ITransferResult接口的对象 网络服务合同 //Service Endpoint Interface @WebService @SOAPBinding(style = Style.RPC) public interface IBankWebSrv { @WebMethod ITransferRe

我越来越熟悉使用Jax-ws(或者JAXB,无论如何也不确定…)的Java中的web服务

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

网络服务合同

//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface IBankWebSrv {
    @WebMethod
    ITransferResult transfer(String accountNumber, double amount);
}
@XmlJavaTypeAdapter(TransferResult.class)
public interface ITransferResult {
    boolean isSuccessful();
    void setSuccessful(boolean successful);
}
Web服务实施

//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;
    }
}
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;
    }
}
转让结果合同

//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface IBankWebSrv {
    @WebMethod
    ITransferResult transfer(String accountNumber, double amount);
}
@XmlJavaTypeAdapter(TransferResult.class)
public interface ITransferResult {
    boolean isSuccessful();
    void setSuccessful(boolean successful);
}
传输结果实施

//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;
    }
}
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;
    }
}
公共类TransferResult扩展了XmlAdapter
实现ITransferResult{
@XmlElement
布尔成功;
公共布尔值isSuccessful(){
返回这个。成功;
}
public void setSuccessful(布尔值成功){
成功的,成功的;
}
@凌驾
公共TransferResult封送处理程序(ITransferResult v)引发异常{
返回(传递结果)v;
}
@凌驾
公共ITransferResult unmarshal(TransferResult v)引发异常{
返回(ITransferResult)v;
}
}
发布web服务时,出现以下错误:

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

原因:java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.illegalannotations异常:1 IllegalAnnotationExceptions计数ITransferResult是一个接口, JAXB不能处理接口。这个问题与 以下地点:ITransferResult

我已经仔细研究了答案,并应用了最重复的技巧,但没有一个对我有用


我遗漏了什么?

它似乎没有将
TransferResult
类上的注释作为可绑定元素进行处理。这意味着您可能需要将
@xmlseealway(TransferResult.class)
添加到接口(
ITransferResult
)。您还需要将
@XmlRootElement
放在序列化实现(
TransferResult
)上,以便生成实际的XML文档,而不仅仅是在其他文档中使用的类型。这是因为当JAX-WS实现创建其内部使用的JAXB上下文时,它只使用您在服务接口上定义的参数和结果类型作为
JAXB.newInstance(…)
的参数;这里没有列出的任何内容(或者可以通过简单地遵循类型来查找)都将被省略,并且使用的类型适配器完全可能没有被处理为注释(毕竟,它们不需要是它们正在调整的接口的实例,也不需要是正在调整的类型的接口)

(是的,SOAP响应是一个随附文档,但建议使用它的方法是将单个元素放入SOAP
正文
,这意味着您需要知道元素的
名称
。这意味着
@XmlRootElement
注释。)



警告:我不是100%确定这会起作用。否则,您将不得不切换到使用具体类型(可能是直POJO)作为结果。这可能不是一件特别令人愉快的事情,但至少很容易做到…

@SOAPBinding(style=style.RPC)

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

两种风格在高层次上的区别如下

  • 文档:返回类型和方法参数在单独的XSD中详细解释了每种类型-对于自定义数据类型(示例为
    ITransferResult
    java.util.List

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


谢谢你的建议,不幸的是,没有一个对我有用。也许我做错了什么。无论如何,正如你所建议的,我放弃了接口的想法,开始使用简单的POJO。无论如何谢谢你!事实上,对我来说,正是这个网站帮助了我。我以前有@SOAPBinding,并将其更改为@SOAPBinding(style=style.RPC),因此没有问题:)