alibaba/Sentinel · error · IllegalArgumentException
Invalid request
Error message
Invalid request
What it means
ClusterConfigService.modifyClusterClientConfig (Sentinel dashboard) pushes a token-client config to a selected machine. It validates that the embedded ClusterClientConfig has a non-empty serverHost and positive serverPort/requestTimeout; otherwise it throws IllegalArgumentException('Invalid request') before any network call.
Source
Thrown at sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java:58
import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author Eric Zhao
* @since 1.4.0
*/
@Service
public class ClusterConfigService {
@Autowired
private SentinelApiClient sentinelApiClient;
@Autowired
private AppManagement appManagement;
public CompletableFuture<Void> modifyClusterClientConfig(ClusterClientModifyRequest request) {
if (notClientRequestValid(request)) {
throw new IllegalArgumentException("Invalid request");
}
String app = request.getApp();
String ip = request.getIp();
int port = request.getPort();
return sentinelApiClient.modifyClusterClientConfig(app, ip, port, request.getClientConfig())
.thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_CLIENT));
}
private boolean notClientRequestValid(/*@NonNull */ ClusterClientModifyRequest request) {
ClusterClientConfig config = request.getClientConfig();
return config == null || StringUtil.isEmpty(config.getServerHost())
|| config.getServerPort() == null || config.getServerPort() <= 0
|| config.getRequestTimeout() == null || config.getRequestTimeout() <= 0;
}
public CompletableFuture<Void> modifyClusterServerConfig(ClusterServerModifyRequest request) {
ServerTransportConfig transportConfig = request.getTransportConfig();
ServerFlowConfig flowConfig = request.getFlowConfig();View on GitHub (pinned to a3f40ba8e9)
Solutions
- Fill in the token server host, port (>0), and request timeout (>0) in the cluster client assignment form/payload.
- Verify the JSON body actually contains clientConfig with serverHost, serverPort, requestTimeout — check for typos or wrong casing.
- If driving the API programmatically, build ClusterClientConfig with all three fields before calling modifyClusterClientConfig.
Example fix
// before
ClusterClientModifyRequest req = new ClusterClientModifyRequest();
req.setClientConfig(new ClusterClientConfig()); // host/port unset
clusterConfigService.modifyClusterClientConfig(req);
// after
ClusterClientConfig cfg = new ClusterClientConfig();
cfg.setServerHost("10.0.0.1");
cfg.setServerPort(18730);
cfg.setRequestTimeout(10);
req.setClientConfig(cfg);
clusterConfigService.modifyClusterClientConfig(req); Defensive patterns
Strategy: validation
Validate before calling
ClusterClientConfig cfg = request.getClientConfig();
boolean valid = cfg != null
&& !StringUtil.isEmpty(cfg.getServerHost())
&& cfg.getServerPort() != null && cfg.getServerPort() > 0
&& cfg.getRequestTimeout() != null && cfg.getRequestTimeout() > 0;
if (!valid) {
return ResponseEntity.badRequest().body("clientConfig requires serverHost, serverPort>0, requestTimeout>0");
}
clusterConfigService.modifyClusterClientConfig(request); Type guard
boolean isClientRequestValid(ClusterClientModifyRequest r) {
ClusterClientConfig c = r.getClientConfig();
return c != null && StringUtil.isNotBlank(c.getServerHost())
&& c.getServerPort() != null && c.getServerPort() > 0
&& c.getRequestTimeout() != null && c.getRequestTimeout() > 0;
} Prevention
- Mirror the service's own notClientRequestValid check in your controller/frontend so users get field-level errors.
- Require all three clientConfig fields in the form before enabling submit.
When it happens
Trigger: POST to the dashboard cluster client config endpoint where request.clientConfig is null, serverHost is blank, or serverPort/requestTimeout is null or <= 0.
Common situations: Dashboard 'Token Client' form submitted with empty server host/port; API callers posting a ClusterClientModifyRequest JSON with missing clientConfig block; reverse-proxy stripping request body fields.
Related errors
- Invalid transport config in request
- Invalid flow config in request
- namespace set cannot be null
- Invalid intervalUnit: {}
- BAD_REQUEST
AI-assisted analysis of alibaba/Sentinel@a3f40ba8e9 (2026-08-14).
Data as JSON: /api/errors/27913820dcb46098.
Report an issue: GitHub.