private ErrorMapper createErrorMapper(
      MessageProcessorConfigHolder config, ServerServiceId svcId, ClassLoader cl)
      throws ServiceException {
    ErrorMapper result;
    String className = config.getErrorMappingClass();
    if (className == null) {
      // if error mapper not configured, use the system default one
      result = new DefaultErrorMapperImpl();
    } else {
      result = ReflectionUtils.createInstance(className, ErrorMapper.class, cl);
    }

    ErrorMapperInitContextImpl initCtx = new ErrorMapperInitContextImpl(svcId);
    result.init(initCtx);
    initCtx.kill();

    return result;
  }
  public ServerServiceDesc createFallbackServiceDesc(QName serviceQName) throws ServiceException {
    ServerServiceId serverSvcId =
        ServerServiceId.createFallbackServiceId(serviceQName.getLocalPart());
    ClassLoader cl = ServiceDesc.class.getClassLoader();

    // create empty pipelines
    Pipeline requestPipeline = createFallbackPipeline(serverSvcId, PipelineMode.REQUEST);
    Pipeline responsePipeline = createFallbackPipeline(serverSvcId, PipelineMode.RESPONSE);

    // create empty operation lists
    Map<String, ServiceOperationDesc> operations = new HashMap<String, ServiceOperationDesc>();
    RequestPatternMatcher<ServiceOperationDesc> operationMatcher =
        new RequestPatternMatcher<ServiceOperationDesc>(true);

    // create empty protocol processor lists
    Map<String, ProtocolProcessorDesc> protocols = new HashMap<String, ProtocolProcessorDesc>();
    RequestPatternMatcher<ProtocolProcessorDesc> protocolMatcher =
        new RequestPatternMatcher<ProtocolProcessorDesc>(true);

    Set<Class> rootClasses = getRootClassesFromOperations(operations.values());

    // create default bindings
    Map<String, DataBindingDesc> bindings = new HashMap<String, DataBindingDesc>();
    addDefaultDataBindings(serverSvcId, bindings, null, rootClasses, null, true);

    // create matchers for bindings
    RequestPatternMatcher<DataBindingDesc> bindingMatcherForRequest =
        new RequestPatternMatcher<DataBindingDesc>(true);
    RequestPatternMatcher<DataBindingDesc> bindingMatcherForResponse =
        new RequestPatternMatcher<DataBindingDesc>(true);
    createDataBindingsMatchers(
        bindings.values(), bindingMatcherForRequest, bindingMatcherForResponse);

    ServiceTypeMappings typeMappings = createFallbackTypeMappings();

    ErrorMapper errorMapper = new DefaultErrorMapperImpl();
    ErrorDataProvider errorDataProviderClass = getDefaultErrorDataProviderClass();

    ErrorMapperInitContextImpl errorMapperInitCtx = new ErrorMapperInitContextImpl(serverSvcId);
    errorMapper.init(errorMapperInitCtx);
    errorMapperInitCtx.kill();

    List<LoggingHandler> loggingHandlers = new ArrayList<LoggingHandler>();
    addDefaultLoggingHandler(serverSvcId, cl, loggingHandlers);

    Dispatcher requestDispatcher = new FallbackRequestDispatcher();
    Dispatcher responseDispatcher = new SimpleServerResponseDispatcher(true);

    VersionCheckHandler versionCheckHandler = new NullVersionCheckHandler();

    VersionCheckHandlerInitContextImpl versionInitCtx =
        new VersionCheckHandlerInitContextImpl(serverSvcId, "1.0", null);
    versionCheckHandler.init(versionInitCtx);
    versionInitCtx.kill();

    Collection<GlobalIdEntry> registryEntries =
        GlobalRegistryConfigManager.getInstance().getAllEntries();
    Map<String, GlobalIdDesc> globalIdMap = createGlobalIdMap(registryEntries, null);

    List<String> serviceLayers =
        ServiceConfigManager.getInstance().getGlobalConfig().getServiceLayerNames();

    ServerServiceDesc result =
        new ServerServiceDesc(
            serverSvcId,
            serviceQName,
            null, // config
            requestPipeline,
            responsePipeline,
            requestDispatcher,
            responseDispatcher,
            operations,
            protocols,
            bindings,
            typeMappings,
            cl,
            loggingHandlers,
            null, // service interface class
            operationMatcher,
            protocolMatcher,
            bindingMatcherForRequest,
            bindingMatcherForResponse,
            null, // service impl class name
            errorMapper,
            errorDataProviderClass,
            globalIdMap,
            versionCheckHandler,
            null,
            UrlMappingsDesc.EMPTY_MAPPINGS,
            new OperationMappings(),
            HeaderMappingsDesc.EMPTY_MAPPINGS,
            HeaderMappingsDesc.EMPTY_MAPPINGS,
            Collections.unmodifiableMap(new HashMap<String, Map<String, String>>()),
            bindings.get(BindingConstants.PAYLOAD_XML),
            bindings.get(BindingConstants.PAYLOAD_XML),
            serviceLayers,
            null,
            null,
            null,
            null);

    return result;
  }