diff --git a/src/main/java/org/apache/sling/models/jacksonexporter/impl/ConfigurableSerializationModuleProvider.java b/src/main/java/org/apache/sling/models/jacksonexporter/impl/ConfigurableSerializationModuleProvider.java
index d9cf2b9..afd4b40 100644
--- a/src/main/java/org/apache/sling/models/jacksonexporter/impl/ConfigurableSerializationModuleProvider.java
+++ b/src/main/java/org/apache/sling/models/jacksonexporter/impl/ConfigurableSerializationModuleProvider.java
@@ -26,6 +26,8 @@
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.osgi.service.metatype.annotations.Designate;
 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.databind.Module;
 import com.fasterxml.jackson.databind.module.SimpleModule;
@@ -39,36 +41,48 @@
     static @interface Config {
 
         @AttributeDefinition(name ="disable serialization",
-                description = "provide a list of the full classnames which should not get serialized")
+                description = "provide a list of the full classnames which should not get serialized; currently only \"" + RESOURCERESOLVER + "\" is supported")
         String[] disable_serialization() default {};
         
         @AttributeDefinition(name ="warn on serialization",
-                description = "provide a list of the full classnames for which a warning should be written when serialized")
+                description = "provide a list of the full classnames for which a warning should be written when serialized; currently only \"" + RESOURCERESOLVER + "\" is supported")
         String[] enable_warn_logging() default {ConfigurableSerializationModuleProvider.RESOURCERESOLVER};
         
 
     }
    
+    private static final Logger LOG = LoggerFactory.getLogger(ConfigurableSerializationModuleProvider.class);
     protected static final String RESOURCERESOLVER = "org.apache.sling.api.resource.ResourceResolver";
     
+    boolean ignoringRR = false;
     
     SimpleModule moduleInstance;
     
-    
-   
-    
     @Activate
     private void activate(Config config) {
         this.moduleInstance = new SimpleModule();
-        
-        // Currently only the Sling ResourceResolver is supported to be disabled, other classes tbd.
+
         List<String> disabled = Arrays.asList(config.disable_serialization());
         List<String> logging = Arrays.asList(config.enable_warn_logging());
         
-        if (disabled.contains(RESOURCERESOLVER)) {
-            moduleInstance.setMixInAnnotation(ResourceResolver.class, IgnoringResourceResolverMixin.class);
-        } else if (logging.contains(RESOURCERESOLVER)) {
-            moduleInstance.setMixInAnnotation(ResourceResolver.class, WarningResourceResolverMixin.class);
+        // Currently only the Sling ResourceResolver is supported
+        for (String type: disabled) {
+            if (RESOURCERESOLVER.equals(type)) {
+                moduleInstance.setMixInAnnotation(ResourceResolver.class, IgnoringResourceResolverMixin.class);
+                ignoringRR = true;
+            } else {
+                LOG.warn("Support to disable the serialization of type {} is not implemented", type);
+            }
+        }
+        
+        for (String type: logging) {
+            if (RESOURCERESOLVER.equals(type)) {
+                if (!ignoringRR) {
+                    moduleInstance.setMixInAnnotation(ResourceResolver.class, WarningResourceResolverMixin.class);
+                }
+            } else {
+                LOG.warn("Support to log any serialization of type {} is not implemented", type);
+            }
         }
     }
     
diff --git a/src/test/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporterLimitSerializationTest.java b/src/test/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporterLimitSerializationTest.java
index 016ccc9..3e9b944 100644
--- a/src/test/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporterLimitSerializationTest.java
+++ b/src/test/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporterLimitSerializationTest.java
@@ -18,9 +18,11 @@
  */
 package org.apache.sling.models.jacksonexporter.impl;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
@@ -30,6 +32,7 @@
 import org.apache.sling.api.resource.PersistenceException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.models.factory.ExportException;
 import org.apache.sling.models.jacksonexporter.impl.example.PojoWithResourceResolver;
 import org.apache.sling.models.jacksonexporter.impl.util.LogCapture;
 import org.apache.sling.testing.mock.osgi.junit5.OsgiContext;
@@ -71,17 +74,40 @@
     @Test
     void testNotSerializingResourceResolverWhenDisabled() throws Exception {
         
+        LogCapture capture = new LogCapture(ConfigurableSerializationModuleProvider.class.getName(),false);
+        
         PojoWithResourceResolver pojo = new PojoWithResourceResolver("text",new EmptyResourceResolver());
         Map<String,Object> config = Collections.singletonMap("disable.serialization", ResourceResolver.class.getName());
         context.registerInjectActivateService(new ConfigurableSerializationModuleProvider(),config);
         
         JacksonExporter underTest = context.registerInjectActivateService(JacksonExporter.class);
         Map<String,String> options = Collections.emptyMap();
+
+        String expectedJson = "{\"msg\":\"text\"}";
+        assertEquals(expectedJson, underTest.export(pojo, String.class, options));
+        // no log is written in this case
+        assertEquals(0,capture.list.size());
+    }
+    
+    
+    @Test
+    void test_givenInvalidTypes_whenActivate_thenWarnLogStatements() throws ExportException {
+        LogCapture capture = new LogCapture(ConfigurableSerializationModuleProvider.class.getName(),false);
         
-        String json = underTest.export(pojo, String.class, options);
-        ObjectMapper mapper = new ObjectMapper();
-        JsonNode result = mapper.readTree(json);
-        assertTrue(result.path("resolver").isMissingNode());
+        Map<String,Object> config = new HashMap<>();
+        config.put("disable.serialization", "foo.bar.disable");
+        config.put("enable.warn.logging", "foo.bar.logging");
+        
+        context.registerInjectActivateService(new ConfigurableSerializationModuleProvider(),config);
+
+        assertTrue(capture.anyMatch(event -> {
+           return event.getFormattedMessage().equals("Support to disable the serialization of type foo.bar.disable is not implemented") && 
+                   event.getLevel().equals(Level.WARN);
+        }));
+        assertTrue(capture.anyMatch(event -> {
+            return event.getFormattedMessage().equals("Support to log any serialization of type foo.bar.logging is not implemented") && 
+                    event.getLevel().equals(Level.WARN);
+         }));
     }
     
     
@@ -90,181 +116,147 @@
      * when trying to export it with Jackson.
      */
     public class EmptyResourceResolver implements ResourceResolver {
-        
-//        public static final String SERIALIZED_STRING = "\"resolver\":{\"live\":false,\"userID\":null,\"searchPath\":null,\"propertyMap\":null,\"userID\":false}";
-        
 
         @Override
         public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Resource resolve(HttpServletRequest request, String absPath) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Resource resolve(String absPath) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Resource resolve(HttpServletRequest request) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public String map(String resourcePath) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public String map(HttpServletRequest request, String resourcePath) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Resource getResource(String path) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Resource getResource(Resource base, String path) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public String[] getSearchPath() {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Iterator<Resource> listChildren(Resource parent) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Iterable<Resource> getChildren(Resource parent) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Iterator<Resource> findResources(String query, String language) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Iterator<Map<String, Object>> queryResources(String query, String language) {
-            // TODO Auto-generated method stub
             return null;
         }
 
 
         @Override
         public ResourceResolver clone(Map<String, Object> authenticationInfo) throws LoginException {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public boolean isLive() {
-            // TODO Auto-generated method stub
             return false;
         }
 
         @Override
         public void close() {
-            // TODO Auto-generated method stub
-            
+            // do nothing
         }
 
         @Override
         public String getUserID() {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Iterator<String> getAttributeNames() {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public Object getAttribute(String name) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public void delete(Resource resource) throws PersistenceException {
-            // TODO Auto-generated method stub
-            
+            // do nothing
         }
 
         @Override
         public Resource create(Resource parent, String name, Map<String, Object> properties)
                 throws PersistenceException {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public void revert() {
-            // TODO Auto-generated method stub
-            
+            // do nothing
         }
 
         @Override
         public void commit() throws PersistenceException {
-            // TODO Auto-generated method stub
-            
+            // do nothing
         }
 
         @Override
         public boolean hasChanges() {
-            // TODO Auto-generated method stub
             return false;
         }
 
         @Override
         public String getParentResourceType(Resource resource) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public String getParentResourceType(String resourceType) {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public boolean isResourceType(Resource resource, String resourceType) {
-            // TODO Auto-generated method stub
             return false;
         }
 
         @Override
         public void refresh() {
-            // TODO Auto-generated method stub
-            
+            // do nothing
         }
-        
     }
-    
-    
 }
