我正在使用 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/