code: @Override
      public <ATTRIBUTE> OptionalThing<ATTRIBUTE> getAttribute(String key, Class<ATTRIBUTE> attributeType) {
          assertArgumentNotNull("key", key);
          final Object original = getRequest().getAttribute(key);
          final ATTRIBUTE attribute;
          if (original != null) {
              try {
                  attribute = attributeType.cast(original);
              } catch (ClassCastException e) {
                  final ExceptionMessageBuilder br = new ExceptionMessageBuilder();
                  br.addNotice("Cannot cast the request attribute");
                  br.addItem("Attribute Key");
                  br.addElement(key);
                  br.addItem("Specified Type");
                  br.addElement(attributeType);
                  br.addItem("Existing Attribute");
                  br.addElement(original.getClass());
                  br.addElement(original);
                  br.addItem("Attribute List");
                  br.addElement(getAttributeNameList());
                  final String msg = br.buildExceptionMessage();
                  throw new RequestAttributeCannotCastException(msg);
              }
          } else {
              attribute = null;
          }
          return OptionalThing.ofNullable(attribute, () -> {
              final List<String> nameList = getAttributeNameList();
              final String msg = "Not found the request attribute by the string key: " + key + " existing=" + nameList;
              throw new RequestAttributeNotFoundException(msg);
          });
      }
docs: -----