java - 你能将一个对象转换为具有特定的功能吗?

标签 java soap jaxb jax-ws

我正在使用 jaxb/jaxws 库来处理 Soap 消息。当发生 SOAP 故障时,我必须将其转换为其中一种消息类型。也就是说,我做了这样的事情:

if(exceptionObject instanceof Message1Data){
     Integer errorCode = ((Message1ExceptionData) exceptionObject).
                           getExceptionData().getErrorCode();
}
if(exceptionObject instanceof Message2Data){
     Integer errorCode = ((Message2ExceptionData) exceptionObject).
                           getExceptionData().getErrorCode();
}
//...

用于一堆不同类型的消息。所有这些都具有 getErrorCode() 函数,但都是自动生成的,因此不存在任何类型的类继承。

因此,这变成了一长串 if 语句,只是为了获取始终存在的错误代码。有没有办法告诉编译器可以在对象上调用此函数,类似于我如何强制转换对象以访问某些函数。因此,我可以删除它并执行类似的操作,而不是执行一堆 if 语句

Integer errorCode = exceptionObject.getExceptionData().getErrorCode();

一次,而不是为每种类型的消息使用相同的代码?或者 jaxb/jaxws 中是否有一个选项可以告诉它每个类都实现一个接口(interface)? (缺少编写允许此操作的自定义库)

最佳答案

<强> JAXB2 Inheritance Plugin 允许您让您的类实现给定的接口(interface)或扩展某个类。

直接在架构中自定义:

<xs:complexType name="WillBeMadeCloneableType">
    <xs:annotation>
        <xs:appinfo>
            <inheritance:implements>java.lang.Cloneable</inheritance:implements>
        </xs:appinfo>
    </xs:annotation>
    <!-- ... -->
</xs:complexType>

或者在外部绑定(bind)文件中:

<jaxb:bindings node="xsd:simpleType[@name='MyType']">
     <inheritance:implements>java.lang.Cloneable</inheritance:implements>
 </jaxb:bindings>

您还可以使用泛型。

自定义 WSDL 有点棘手,但也是可能的。

披露:我是 JAXB2 Inheritance plugin 的作者这是 JAXB2 Basics 的一部分包。

文档目前正在移至 GitHub 。请检查以下链接:

关于java - 你能将一个对象转换为具有特定的功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26637338/

相关文章:

java - HotSpot JVM 中的动态 tenuring 阈值调整是如何工作的?

Java SE do while 循环问题

c# - 动态执行基于 SOAP 的 Web 服务而不生成代理

java - 如何使用 JAXB 附加外部生成的 XML 而不是 POJO 的变量值?

java - JAXB 继承冲突 - 在子类上重新注释

Java - 从内部类引用变量必须是最终的/有效的最终循环

java - 检查 List<String> 是否包含唯一字符串的最快方法

java - 将X509证书标签值转换为数字签名cxf wss4j中的base64二进制编码

java - 将 json 格式的参数数组传递给 SOAP Web 服务?

java - 验证 JAXB,但不忽略空格