当前位置: 首页 > 知识库问答 >
问题:

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

申奇希
2023-03-14

我越来越熟悉Java使用Jax-ws(或JAXB,不确定,反正...)的网络服务。

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

Web服务合同

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

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

转让结果合同

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

转移结果实现

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

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

异常线程"main"javax.xml.ws.WebServiceExcture:无法创建JAXBContext...

原因:java。安全PrivilegedActionException:com。太阳xml。内部的绑定v2。运行时。IllegalAnnotationsException:1 IllegalAnnotationException计数ITransferResult是一个接口,JAXB无法处理接口。此问题与以下位置有关:在ITransferResult

我已经看了SO寻找答案,并应用了最重复的技巧,但没有一个对我有用。

我错过了什么?

共有2个答案

司马狐若
2023-03-14

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

(是的,SOAP响应是一个附加文档,但是推荐的使用方法是在SOAPBody中放入一个元素,这意味着您需要知道元素的name。这意味着一个@XmlRootElement注释。(

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

常永长
2023-03-14

@SOAPBinding(style=style.RPC)

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

这两种风格在高级水平上的区别如下

>

  • 文档:返回类型和方法参数在单独的XSD中得到了清晰的解释,每个类型都有详细的说明——在自定义数据类型的情况下很有帮助(例如在您的情况下ITransferResultjava.util.列表)。

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

  •  类似资料:
    • 在我的应用程序中有一个对象树。要构成该树,每个对象都有一个父引用。由于某些对象类型可以是多个父对象类型的子对象,所有潜在的父对象类型都通过实现公共接口来统一。我尽可能地缩小了问题的范围(JAXB抱怨父成员变量(注释为@XmlIDREF和@xmldattribute)是一个接口): 这是我在尝试运行它时得到的例外: com.sun.xml.internal.bind.v2.runtime.非法注释异

    • 问题内容: 尝试部署应用程序时,似乎出现以下异常: 我的代码运行良好,直到将返回类型从List更改为List > 这是部分Web服务: 我也尝试过通过删除@SOAPBinding并尝试使用默认值,但是会出现相同的结果。 感谢任何帮助 更新 我要注意一些事情。我将所有List更改为ArrayList,然后进行编译。我之所以说编译但不起作用是因为它的行为很奇怪。我得到一个类型为Object的对象:Re

    • 问题内容: 嗨,我是Android编程的新手,我想问的问题可能很简单,但是我对如何使其工作一无所知,请多多包涵。 我从Android开发人员网站安装了android-sdk和相关工具。我按照他们的指示创建了HelloWorld应用,但出现了一些我不理解的错误。 文件MainActivity.java是一个自动生成的文件,在以下位置,我不断出现此文件错误: 因此,我尝试浏览生成的class文件中的l

    • 我正在尝试使用restTemplate(Spring)和Jackson 2.3.0构建一个JSON Web服务消费者 问题在于pojo的绑定,如下所示: Jackson输出以下错误: org.springframework.http.converter.HttpMessageNotReadableException:无法读取JSON:无法识别的字段"montant_TTC"(类com.bouygt

    • 我使用CXF2.7.5调用Web服务。我使用wsdl2java程序(在命令行MSDOS和maven中)生成了客户机类。我必须使用xmlbeans数据绑定,因为使用jaxb(默认数据绑定)时会出现一些错误,并且无法修改服务器端。因此,使用xmlbeans数据绑定参数,生成就可以了。 我用以下方法调用web方法: ... 当我调用webmethods时,它可以在简单的java程序上完美地工作,但在po

    • 我试图从通过JAXB生成的类序列化XML。 班级: 文件“package-info.java”: 编组器(简化,无需错误处理): 此代码生成: 我期待这样的事情: 我有一个类似的代码并且工作正常,但是我不明白为什么这个代码不显示命名空间。有线索吗?谢谢!