【问题标题】:Can you cast an object to have a specific function?您可以将对象强制转换为具有特定功能吗?
【发布时间】:2014-10-29 17:49:01
【问题描述】:

我正在使用 jaxb/jaxws 库来处理 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 中是否有一个选项可以告诉它这些类中的每一个都实现了一个接口? (少写一个允许这样做的自定义库)

【问题讨论】:

标签: java soap jaxb jax-ws


【解决方案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。请检查以下链接:

【讨论】:

    【解决方案2】:

    不确定你的对象是如何设置的,希望它有一个包含你的 errorCode 的基本异常,因为使用 instanceOf 来判断你有什么异常是非常糟糕的方法。您可能应该根据您的 errerCode 确定您的异常:

    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: ...
    }
    

    【讨论】:

      【解决方案3】:

      反射可能会起作用。这取决于异常类的确切结构。这样的事情可能会奏效:

      Method method = exceptionObject.getClass().getMethod("getExceptionData");
      ExceptionData exceptionData = (ExceptionData) method.invoke(exceptionObject);
      Integer errorCode = exceptionData.getErrorCode();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-20
        • 2020-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多