我使用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语句来获取errorCode,它始终存在。有没有办法告诉编译器可以在对象上调用此函数,类似于我如何为了访问某些函数而转换对象。因此,我可以删除它并执行类似
之类的操作,而不是执行一堆if语句Integer errorCode = exceptionObject.getExceptionData().getErrorCode();
一次,而不是每种类型的消息相同的代码?或者jaxb / jaxws中有一个选项告诉它每个类都实现了一个接口吗? (没有写一个允许这个的自定义库)
答案 0 :(得分:1)
JAXB2 Inheritance Plugin 允许您让您的类实现给定的接口或扩展某个类。
直接在架构中进行自定义:
<xs:complexType name="WillBeMadeCloneableType">
<xs:annotation>
<xs:appinfo>
<inheritance:implements>java.lang.Cloneable</inheritance:implements>
</xs:appinfo>
</xs:annotation>
<!-- ... -->
</xs:complexType>
或者在外部绑定文件中:
<jaxb:bindings node="xsd:simpleType[@name='MyType']">
<inheritance:implements>java.lang.Cloneable</inheritance:implements>
</jaxb:bindings>
您也可以使用泛型。
自定义WSDL有点棘手,但也有可能。
披露:我是JAXB2 Inheritance plugin包的一部分JAXB2 Basics的作者。
目前正在将文档移至GitHub。请检查以下链接:
答案 1 :(得分:0)
不确定你的对象是如何设置的,希望它有一个包含你的errorCode的基本异常,因为使用instanceOf是告诉你有什么异常的非常糟糕的方法。你可能应该根据你的errerCode建立Exception:
interface ExceptionBase extends Exception { public int getErrorCode; }
class Message1ExceptionData implements ExceptionBase {
public int getErrorCode() { return 1; }
}
class Message2ExceptionData implements ExceptionBase { ... return 2; }
switch(exceptionObject.getErrorCode()) {
case 1: Message1ExceptionData exception = (Message1ExceptionData) exceptionObject;
case 2: ...
}
答案 2 :(得分:0)
反思可能有效。它取决于异常类的确切结构。这样的事情可能会成功:
Method method = exceptionObject.getClass().getMethod("getExceptionData");
ExceptionData exceptionData = (ExceptionData) method.invoke(exceptionObject);
Integer errorCode = exceptionData.getErrorCode();