docs: @Override
      public Object getInjectionObject(Object targetObject,
                                       InjectionTargetContext targetContext) throws InjectionException {
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "getInjectionObject", new Object[] { Util.identity(targetObject), Util.identity(targetContext) });
          }
  
          Object retObj = null;
  
          //First attempt to get the injection object, and handle any exceptions thrown in the process.
          try {
              retObj = getInjectionObjectInstance(targetObject, targetContext);
          } catch (RecursiveInjectionException ex) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  Tr.debug(tc, "getInjectionObject: " + ex);
              throw ex;
          } catch (Throwable ex) {
  
              if (CDIUtils.isInjectionFailureIgnored()) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
                      Tr.exit(tc, "com.ibm.ws.cdi.ignoreInjectionFailure = true, ignoring InjectionException and will return null", ex);
                  }
                  return null;
              }
  
              // Only log FFDC if this is a failed injection; failed naming lookups may
              // be normal and the caller should decide if FFDC is needed.
              if (targetObject != null) {
                  FFDCFilter.processException(ex, CLASS_NAME + ".getInjectionObject",
                                              "408", this, (Object[]) null);
              }
  
              String displayName = getDisplayName();
              Object exMessage = ex.getLocalizedMessage();
              if (exMessage == null) {
                  exMessage = ex.toString();
              }
  
              String message = Tr.formatMessage(tc,
                                                "FAILED_TO_CREATE_OBJECT_INSTANCE_CWNEN0030E",
                                                displayName,
                                                exMessage);
              InjectionException ex2 = new InjectionException(message, ex);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  Tr.debug(tc, "getInjectionObject", ex2);
              throw ex2;
          }
  
          //If the injection object returned was null this is illegal and an exception must be thrown.
          if (retObj == null) {
              String classTypeName, component, module, app;
              if (ivJ2eeName != null) {
                  component = ivJ2eeName.getComponent();
                  module = ivJ2eeName.getModule();
                  app = ivJ2eeName.getApplication();
              } else {
                  component = module = app = "UNKNOWN";
              }
  
              classTypeName = getInjectionClassType() == null ? "UNKNOWN" : getInjectionClassType().getName();
  
              Tr.error(tc, "UNABLE_TO_RESOLVE_INJECTION_OBJECT_CWNEN0035E",
                       getDisplayName(),
                       classTypeName,
                       component,
                       module,
                       app); // d468667 d502635.1
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  Tr.debug(tc, "getInjectionObject : failed");
  
              //TODO This message should be NLS. This code is shared with the superclass in injection engine, so when the
              //NLS variant is complete it should be used there too.
              InjectionException ex = new InjectionException("The " + getDisplayName() + " reference of type " +
                                                             classTypeName + " for the " +
                                                             component + " component in the " +
                                                             module + " module of the " +
                                                             app + " application cannot be resolved."); // d502635.1
  
              if (CDIUtils.isInjectionFailureIgnored()) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
                      Tr.exit(tc, "com.ibm.ws.cdi.ignoreInjectionFailure = true, ignoring InjectionException and will return null", ex);
                  }
                  return null;
              } else {
                  throw ex;
              }
          }
  
          //However there is an edge case where an injection object can be null if it comes from a
          //@Dependent scoped producer. See the CDI spec, section 3.3
  
          //If the injection object returned was of the type InjectableNull that means a null was returned
          //But it fell under that edge case. Now that we have gone past the null check we can safely
          //Convert InjectableNull objects back into a regular null
  
          if (retObj instanceof InjectableNull) {
              retObj = null;
          } else if (retObj instanceof Object[]) {
              Object[] retObjArray = (Object[]) retObj;
              for (int i = 0; i < retObjArray.length; i++) {
                  if (retObjArray[i] instanceof InjectableNull) {
                      retObjArray[i] = null;
                  }
              }
              retObj = retObjArray;
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "getInjectionObjectInstance", Util.identity(retObj));
          }
          return retObj;
      }