code: protected <S extends Specification<?>> T convert(S specification, C context) {
          if (specification instanceof SubstitutableSpecification) {
              return convert(((SubstitutableSpecification<?>) specification).getSubstitute(), context);
          } else {
              SpecificationConverter<S, C, T> converter;
              Class<? extends Specification> specificationClass = specification.getClass();
              try {
                  converter = injector.getInstance(buildKey(specificationClass));
              } catch (ConfigurationException e) {
                  throw BusinessException.wrap(e, BusinessErrorCode.NO_CONVERTER_FOUND)
                          .put("contextClass", contextClass)
                          .put("targetClass", targetClass)
                          .put("specificationClass", specificationClass);
              }
              return converter.convert(specification, context, this);
          }
      }
docs: Find and invoke the relevant {@link SpecificationConverter} for the given specification to
  convert it into an object of type {@link T}.
  
  @param specification the specification to convert.
  @param context       the translation context.
  @param <S>           the type of the specification to convert.
  @return the converted target object representing the given specification.