你能投射一个具有特定功能的物体吗?

时间:2014-10-29 17:49:01

标签: 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语句来获取errorCode,它始终存在。有没有办法告诉编译器可以在对象上调用此函数,类似于我如何为了访问某些函数而转换对象。因此,我可以删除它并执行类似

之类的操作,而不是执行一堆if语句
Integer errorCode = exceptionObject.getExceptionData().getErrorCode();

一次,而不是每种类型的消息相同的代码?或者jaxb / jaxws中有一个选项告诉它每个类都实现了一个接口吗? (没有写一个允许这个的自定义库)

3 个答案:

答案 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();