code: private static List<EntryPointParameter> getInternalEntryPointParametersRecursively(Class<?> parameterType, Set<Class<?>> typeBlacklist, Set<String> nameBlacklist, Field parent, int level, int maxDeepLevel) {
  		final List<EntryPointParameter> list = new ArrayList<EntryPointParameter>();
  		for (Field field : parameterType.getDeclaredFields()) {
  			field.setAccessible(true);
  
  			if (typeBlacklist.contains(field.getType()) || nameBlacklist.contains(field.getName())) {
  				continue;
  			}
  			
  			if (isSimpleRequestParameter(field.getType())) {
  				final EntryPointParameter param = new EntryPointParameter();
  				param.setName(parent != null ? parent.getName() + "." + field.getName() : field.getName());
  				param.setType(field.getType());
  
  				list.add(param);
  			} else if (shouldWeGoDeep(field.getType()) && level < maxDeepLevel) {
  				// Object arrays are not supported and lists are not supported
  				list.addAll(getInternalEntryPointParametersRecursively(field.getType(), typeBlacklist, nameBlacklist, field, ++level, maxDeepLevel));
  			} else {
  				LOGGER.warn("We might have reached a cycle, ignoring parameter {}", field.getName());
  			}
  		}
  		return list;
  	}
docs: Deeply finds all the attributes of the supplied class
  
  @param parameterType Type of parameter
  @param typeBlacklist blackList by type
  @param nameBlacklist blackList by name
  @param parent parent
  @param level what the level of immersion now
  @param maxDeepLevel How deep should algorithm go in the object
  @return List