OIM异常信息显示

结论

先说结论,OIM无法动态展示预配的错误信息,也就是说,错误信息是固定的,写死的,具体原因我下面会讲到。

过程

OIM同步数据是通过task进行同步,task可以关联一系列的Response,Response可以通过design console进行配置,如图:

错误信息就定义在Description这个字段中,那错误如何跟这些定义关联在一起的?在java中通过抛出异常的方式,connector会根据异常的类型选择对应的response,对应的规则就是根据Response名称转java类对应,比如程序中如果抛出了一个ConnectorException那么就对应配置中的CONNECTOR_EXCEPTION,通过反编译webservice connector的源码,我们可以发现webservice支持以下几种exception

public Uid create(ObjectClass objClass, Set<Attribute> attrs, OperationOptions op)
  {
    UserAccount userAccDetails = ConversionUtil.convertToUserDetails(attrs, this._config.getPasscode());
    
    this._log.info("Invoking create operation on {0}", new Object[] { attrs });
    try
    {
      String createReply = this._soaServicePort.create(objClass.getObjectClassValue(), userAccDetails);
      
      Uid uidVal = new Uid(createReply);
      this._log.ok("Create Success, Uid - {0}", new Object[] { uidVal });
      return uidVal;
    }
    catch (AlreadyExistsException_Exception e)
    {
      this._log.error(e, "Account already exists", new Object[0]);
      throw new AlreadyExistsException(e);
    }
    catch (ConnectionBrokenException_Exception e)
    {
      this._log.error(e, "Unable to reach target webservice endpoint", new Object[0]);
      throw new ConnectionBrokenException("Connection to target webservice is broken", e);
    }
    catch (Exception e)
    {
      this._log.error(e, "Error during create", new Object[0]);
      throw new ConnectorException("Error during create", e);
    }
  }
  • AlreadyExistsException
  • ConnectionBrokenException
  • ConnectorException

根据代码逻辑也可以知道,所有自定义的消息都进入到了ConnectorException中,当发生错误时,界面显示如下:

跟我们定义的错误描述是一致的。在OIM的源码中,我们也可以发现支持的异常类型,也不多

OIM提供了这些类型的异常,具体支持程度取决于connector的实现。

修改

目前是不能在designconsole上直接进行修改,修改报错

  • 方案1

如果你的connector还没创建,可以修改template/ConnectorTemplate.template中的描述

<TaskResponse name="ERROR" repo-type="RDBMS">
  <RSC_DESC>Error Occurred</RSC_DESC>
  <RSC_UPDATE>1350032124000</RSC_UPDATE>
  <STA_KEY Status="R"></STA_KEY>
</TaskResponse>
<TaskResponse name="SUCCESS" repo-type="RDBMS">
  <RSC_DESC>Child Form attribute value Deleted</RSC_DESC>
  <RSC_UPDATE>1350032124000</RSC_UPDATE>
  <STA_KEY Status="C"></STA_KEY>
</TaskResponse>
<TaskResponse name="UNKNOWN" repo-type="RDBMS">
  <RSC_DESC>An unknown response was received</RSC_DESC>
  <RSC_UPDATE>1350032124000</RSC_UPDATE>
  <STA_KEY Status="R"></STA_KEY>
</TaskResponse>
<TaskResponse repo-type="RDBMS" name="UNKNOWN_UID">
  <RSC_DESC>Object does not exist in the target</RSC_DESC>
  <RSC_UPDATE>1350032124000</RSC_UPDATE>
  <STA_KEY Status="R"/>
</TaskResponse>
<TaskResponse repo-type="RDBMS" name="CONNECTION_BROKEN">
  <RSC_DESC>Unable to connect to target webservice endpoint</RSC_DESC>
  <RSC_UPDATE>1350032124000</RSC_UPDATE>
  <STA_KEY Status="R"/>
</TaskResponse>
<TaskResponse repo-type="RDBMS" name="CONNECTOR_EXCEPTION">
  <RSC_DESC>Unable to perform operation on the target</RSC_DESC>
  <RSC_UPDATE>1350032124000</RSC_UPDATE>
  <STA_KEY Status="R"/>
</TaskResponse>
  • 方案2

这个数据保存在数据库rsc表中的rsc_desc字段上,你也可以统一执行update语句,将所有相同的描述信息更新。但这个方案没试过,最好在测试环境中试。

Trackback

no comment untill now

Add your comment now