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
- 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").
- 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.
- Correct any typo in the merger name and confirm the SPI file name matches the extension loader path.
- 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
- Register custom Merger @SPI classes under META-INF/dubbo with the exact extension name.
- Use merger="true" only for return types MergerFactory supports (primitives, arrays, collections).
- Add a startup smoke test that resolves the configured merger name.
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
- Can not merge result because missing method [ {merger} ] in
- Arguments' types are different
- Failed to invoke service {entry.getKey()}: {e.getMessage()}
- Can not merge result: {e.getMessage()}
- mock error : {mt.getMessage()}, invoke error is :{StringUtil
AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14).
Data as JSON: /api/errors/c293e1cf1b4f1900.
Report an issue: GitHub.