flowable/flowable-engine · error · FlowableIllegalArgumentException
Provided last name is null
Error message
Provided last name is null
What it means
FlowableIllegalArgumentException thrown by UserQueryImpl.userLastName when the lastName argument is null. The engine validates criteria eagerly at query-construction time; a null last name is not a valid equality filter, so it is rejected with a clear message instead of producing invalid SQL. Supply a concrete last-name string.
Solutions
- Pass a concrete non-null last name: userLastName("Smith")
- Apply the criterion conditionally: if (lastName != null) query.userLastName(lastName)
- Use userLastNameLike("%") if you need a wildcard 'any last name' filter rather than null
- Sanitize/validate the source field (request param, DTO, profile attribute) before building the query
Example fix
// before
User user = identityService.createUserQuery().userLastName(req.getParameter("lastName")).singleResult();
// after
String lastName = req.getParameter("lastName");
UserQuery query = identityService.createUserQuery();
if (lastName != null) {
query = query.userLastName(lastName);
}
User user = query.singleResult(); Defensive patterns
Strategy: validation
Validate before calling
if (lastName == null) { throw new IllegalArgumentException("lastName is required"); }
identityService.createUserQuery().userLastName(lastName); Type guard
boolean isPresent(String v) { return v != null && !v.trim().isEmpty(); } Try / catch
try {
query.userLastName(lastName);
} catch (FlowableIllegalArgumentException e) {
log.warn("Missing last-name criterion: {}", e.getMessage());
} Prevention
- Validate surname input at the entry point (controller/service) before querying
- Use conditional chaining for optional criteria
- Remember the engine rejects null, not empty strings — still avoid empty filters
- Cover nullable profile fields (e.g. from LDAP/SSO sync) with explicit defaults
When it happens
Trigger: Calling identityService.createUserQuery().userLastName(null), or chaining userLastName(value) where value came from a nullable variable, request parameter, or user profile field that was null.
Common situations: User lookup forms with empty surname field; code that assumes a profile field exists but it was never populated; copying values from external systems (SSO/LDAP sync) where last name is optional.
Related errors
- Provided display name is null
- Provided full name is null
- appsDefinitionIds is null
- at least one of userId or groups must be provided
- Business status is null
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/f54789dd58e480c8.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-idm-engine/src/main/java/org/flowable/idm/engine/impl/UserQueryImpl.java:123
throw new FlowableIllegalArgumentException("Provided first name is null");
}
this.firstNameLike = firstNameLike;
return this;
}
@Override
public UserQuery userFirstNameLikeIgnoreCase(String firstNameLikeIgnoreCase) {
if (firstNameLikeIgnoreCase == null) {
throw new FlowableIllegalArgumentException("Provided first name is null");
}
this.firstNameLikeIgnoreCase = firstNameLikeIgnoreCase.toLowerCase();
return this;
}
@Override
public UserQuery userLastName(String lastName) {
if (lastName == null) {
throw new FlowableIllegalArgumentException("Provided last name is null");
}
this.lastName = lastName;
return this;
}
@Override
public UserQuery userLastNameLike(String lastNameLike) {
if (lastNameLike == null) {
throw new FlowableIllegalArgumentException("Provided last name is null");
}
this.lastNameLike = lastNameLike;
return this;
}
@Override
public UserQuery userLastNameLikeIgnoreCase(String lastNameLikeIgnoreCase) {
if (lastNameLikeIgnoreCase == null) {
throw new FlowableIllegalArgumentException("Provided last name is null");View on GitHub (pinned to d6d39ce1c6)