Activiti/Activiti · error · ELException

error.function.access

Error message

error.function.access

What it means

Raised by AstFunction.eval when the resolved function Method is not accessible to the caller — e.g. it is private/protected/package-private or its class is not accessible — so Method.invoke throws IllegalAccessException, rethrown as ELException error.function.access.

Solutions

  1. Make the function method public
  2. Call setAccessible(true) in the FunctionMapper before returning the Method
  3. Expose the function via a public wrapper class
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at activiti-core-common/activiti-juel-jakarta/src/main/java/org/activiti/core/el/juel/tree/impl/ast/AstFunction.java:124 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Activiti/Activiti@56435b1a97 (2026-09-09). Data as JSON: /api/errors/d45c2ea6d26c478f. Report an issue: GitHub.

Appendix: source

Thrown at activiti-core-common/activiti-juel-jakarta/src/main/java/org/activiti/core/el/juel/tree/impl/ast/AstFunction.java:124

            } else {
                for (int i = 0; i < params.length; i++) {
                    Object param = getParam(i).eval(bindings, context);
                    if (param != null || types[i].isPrimitive()) {
                        params[i] = bindings.convert(param, types[i]);
                    }
                }
            }
        }
        return method.invoke(base, params);
    }

    @Override
    public Object eval(Bindings bindings, ELContext context) {
        Method method = bindings.getFunction(index);
        try {
            return invoke(bindings, context, null, method);
        } catch (IllegalAccessException e) {
            throw new ELException(LocalMessages.get("error.function.access", name), e);
        } catch (InvocationTargetException e) {
            throw new ELException(LocalMessages.get("error.function.invocation", name), e.getCause());
        }
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public void appendStructure(StringBuilder b, Bindings bindings) {
        b.append(bindings != null && bindings.isFunctionBound(index) ? "<fn>" : name);
        params.appendStructure(b, bindings);
    }

    public int getIndex() {
        return index;

View on GitHub (pinned to 56435b1a97)