code: protected void validateConsumes(Collection<String> contentTypes) {
          Set<String> ignoreConsumes = new TreeSet<>();
          ignoreConsumes.add(Consumes.ALL);
  
          // these are handled by the TemplateEngine
          ignoreConsumes.add(Consumes.HTML);
          ignoreConsumes.add(Consumes.XHTML);
  
          // these are handled by the Servlet layer
          ignoreConsumes.add(Consumes.FORM);
          ignoreConsumes.add(Consumes.MULTIPART);
  
          for (String declaredConsume : declaredConsumes) {
              if (ignoreConsumes.contains(declaredConsume)) {
                  continue;
              }
  
              String consume = declaredConsume;
              int fuzz = consume.indexOf('*');
              if (fuzz > -1) {
                  // strip fuzz, we must have a registered engine for the unfuzzed content-type
                  consume = consume.substring(0, fuzz);
              }
  
              if (!contentTypes.contains(consume)) {
                  if (consume.equals(declaredConsume)) {
                      throw new PippoRuntimeException("{} declares @{}(\"{}\") but there is no registered ContentTypeEngine for that type!",
                              LangUtils.toString(controllerMethod), Consumes.class.getSimpleName(), declaredConsume);
                  } else {
                      throw new PippoRuntimeException("{} declares @{}(\"{}\") but there is no registered ContentTypeEngine for \"{}\"!",
                              LangUtils.toString(controllerMethod), Consumes.class.getSimpleName(), declaredConsume, consume);
                  }
              }
          }
      }
docs: Validates that the declared consumes can actually be processed by Pippo.
  
  @param contentTypes