weaviate/weaviate · error

expected source map to have a usable Resolver, but got %#v

Error message

expected source map to have a usable Resolver, but got %#v

What it means

After confirming the Get root source is a map, resolveGet asserts source["Resolver"] is the get.Resolver interface. A map without a usable Resolver entry (nil or wrong type) triggers this error. As with 858, it signals broken internal schema wiring rather than bad user input.

Source

Thrown at adapters/handlers/graphql/local/get/class_builder_fields.go:343

		result, err := r.resolveGet(p, className)
		if err != nil {
			return result, enterrors.NewErrGraphQLUser(err, "Get", className)
		}
		return result, nil
	}
}

func (r *resolver) resolveGet(p graphql.ResolveParams, className string) (interface{}, error) {
	principal := restCtx.GetPrincipalFromContext(p.Context)

	source, ok := p.Source.(map[string]interface{})
	if !ok {
		return nil, fmt.Errorf("expected graphql root to be a map, but was %T", p.Source)
	}

	resolver, ok := source["Resolver"].(Resolver)
	if !ok {
		return nil, fmt.Errorf("expected source map to have a usable Resolver, but got %#v", source["Resolver"])
	}

	var tenant string
	if tk, ok := p.Args["tenant"]; ok {
		tenant = tk.(string)
	}

	if err := r.authorizer.Authorize(p.Context, principal, authorization.READ, authorization.ShardsData(className, tenant)...); err != nil {
		return nil, err
	}

	pagination, err := filters.ExtractPaginationFromArgs(p.Args)
	if err != nil {
		return nil, err
	}

	cursor, err := filters.ExtractCursorFromArgs(p.Args)
	if err != nil {

View on GitHub (pinned to 75aa4b6d11)

Solutions

  1. Set source["Resolver"] to a value implementing get.Resolver when building the Get root source
  2. In tests, use the Resolver returned from the get schema builder instead of stubs of the wrong type
  3. Grep your patches for changes to the Get root field registration and restore the Resolver entry
  4. Run an official release where this wiring is unchanged

Example fix

// before
src := map[string]interface{}{"Resolver": nil}
// after
src := map[string]interface{}{"Resolver": get.Resolver(realResolver)}
Defensive patterns

Strategy: type-guard

Validate before calling

m, ok := s.(map[string]interface{})
if !ok { return errors.New("not a map") }
if _, ok := m["Resolver"].(Resolver); !ok {
    return errors.New("Get source missing usable Resolver")
}

Type guard

func extractGetResolver(m map[string]interface{}) (Resolver, bool) {
    r, ok := m["Resolver"].(Resolver)
    return r, ok
}

Try / catch

resolver, ok := source["Resolver"].(Resolver)
if !ok {
    return nil, fmt.Errorf("expected source map to have a usable Resolver, but got %#v", source["Resolver"])
}

Prevention

When it happens

Trigger: The Get root source map was built without the "Resolver" key or stored a non-Resolver value — from hand-built test sources, renamed keys in a fork, or a refactor that re-typed the resolver.

Common situations: Forked schema assembly; test harnesses constructing the source map manually; refactors of get.Resolver that changed the interface and left stale values in the source map.

Related errors


AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04). Data as JSON: /api/errors/ce445a4d2245d949. Report an issue: GitHub.