docs: @Override
      public void init(FilterConfig filterConfig) throws PortletException {
          Assert.notNull(filterConfig, "FilterConfig must not be null");
          if (logger.isDebugEnabled()) {
              logger.debug("Initializing filter '" + filterConfig.getFilterName() + "'");
          }
  
          this.filterConfig = filterConfig;
  
          // Set bean properties from init parameters.
          try {
              PropertyValues pvs = new FilterConfigPropertyValues(filterConfig, this.requiredProperties);
              BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
              ResourceLoader resourceLoader = new PortletContextResourceLoader(filterConfig.getPortletContext());
              bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));
              initBeanWrapper(bw);
              bw.setPropertyValues(pvs, true);
          }
          catch (BeansException ex) {
              String msg = "Failed to set bean properties on filter '" +
                  filterConfig.getFilterName() + "': " + ex.getMessage();
              logger.error(msg, ex);
              throw new PortletException(msg, ex);
          }
  
          // Let subclasses do whatever initialization they like.
          initFilterBean();
  
          if (logger.isDebugEnabled()) {
              logger.debug("Filter '" + filterConfig.getFilterName() + "' configured successfully");
          }
      }