apache/dubbo · error · RpcException

There is no merger to merge result.

Error message

There is no merger to merge result.

What it means

Thrown by MergeableClusterInvoker when merger resolution finds no Merger to use. When merger is neither a leading-dot method nor resolves to a default ('true'/'default') via MergerFactory nor to a named Merger SPI extension, resultMerger stays null and Dubbo cannot combine the per-group results.

Source

Thrown at dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/MergeableClusterInvoker.java:195

            ApplicationModel applicationModel = ScopeModelUtil.getApplicationModel(
                    invocation.getModuleModel().getApplicationModel());

            if (ConfigUtils.isDefault(merger)) {
                resultMerger = applicationModel
                        .getBeanFactory()
                        .getBean(MergerFactory.class)
                        .getMerger(returnType);
            } else {
                resultMerger = applicationModel.getExtensionLoader(Merger.class).getExtension(merger);
            }
            if (resultMerger != null) {
                List<Object> rets = new ArrayList<>(resultList.size());
                for (Result r : resultList) {
                    rets.add(r.getValue());
                }
                result = resultMerger.merge(rets.toArray((Object[]) Array.newInstance(returnType, 0)));
            } else {
                throw new RpcException("There is no merger to merge result.");
            }
        }
        return AsyncRpcResult.newDefaultAsyncResult(result, invocation);
    }

    @Override
    public Class<T> getInterface() {
        return directory.getInterface();
    }

    @Override
    public boolean isAvailable() {
        return directory.isAvailable();
    }

    @Override
    public void destroy() {
        directory.destroy();

View on GitHub (pinned to 3a3043227f)

Solutions

  1. Implement and register a custom org.apache.dubbo.rpc.cluster.Merger @SPI for your return type under META-INF/dubbo and reference it by name (merger="myMerger").
  2. If the return type is a primitive/array/collection, ensure you use merger="true" so MergerFactory can pick the built-in merger; verify the type is supported.
  3. Correct any typo in the merger name and confirm the SPI file name matches the extension loader path.
  4. Alternatively use the dot-method form (merger=".combine") if the return type can merge itself.

Example fix

// before: no merger registered for custom DTO
<dubbo:reference interface="com.acme.Fanout" group="*" merger="true"/>

// after: register a named SPI merger
public class ReportMerger implements Merger<Report> {
    @Override public Report merge(Report[] others) { /* ... */ }
}
// META-INF/dubbo/org.apache.dubbo.rpc.cluster.Merger  ->  report=com.acme.ReportMerger
<dubbo:reference interface="com.acme.Fanout" group="*" merger="report"/>
Defensive patterns

Strategy: validation

Validate before calling

// At startup, verify a Merger resolves for the return type / name
Merger<?> m = ConfigUtils.isDefault(mergerName)
    ? mergerFactory.getMerger(returnType)
    : extensionLoader.getExtension(mergerName);
if (m == null) {
    throw new IllegalStateException("no merger resolves for " + mergerName + " / " + returnType);
}

Prevention

When it happens

Trigger: Configuring merger="someName" where 'someName' is not 'true'/'default' and is not a registered Merger @SPI extension; or merger="true"/"default" but MergerFactory has no built-in Merger registered for the service return type (e.g. a custom DTO with no array-merger).

Common situations: Using merger="true" on a return type that has no corresponding MergerFactory entry (custom objects rather than primitives/collections/arrays); typo in a custom Merger extension name; custom Merger @SPI class not placed under META-INF/dubbo or misspelled name; upgrading Dubbo and dropping the SPI file.

Related errors


AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14). Data as JSON: /api/errors/c293e1cf1b4f1900. Report an issue: GitHub.