code: protected Object filterPathParam(ActionExecute execute, int index, Class<?> paramType, Map<Integer, Class<?>> optGenTypeMap,
              String plainValue) {
          if (plainValue == null || plainValue.isEmpty()) {
              if (optGenTypeMap.containsKey(index)) { // optional parameter
                  return createEmptyOptional(execute, index, paramType);
              } else { // required but no value
                  return null; // will be checked immediately later
              }
          }
          final String decoded = urlDecode(plainValue);
          try {
              return doFilterPathParam(execute, index, paramType, optGenTypeMap, decoded);
          } catch (NumberFormatException | ParseDateException | ParseBooleanException e) { // conversion failures
              // _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
              // suppress easy 500 error by e.g. non-number path parameter
              //  (o): /edit/123/
              //  (x): /edit/abc/ *this case
              // 
              // classification's failure is already handled as 404 here
              // _/_/_/_/_/_/_/_/_/_/
              handleParameterConversionFailureException(execute, index, paramType, plainValue, decoded, e);
              return null; // unreachable
          }
      }
docs: ====================