Allow adapters/serializers to be used on known root types
diff --git a/src/main/java/org/eclipse/yasson/internal/AnnotationIntrospector.java b/src/main/java/org/eclipse/yasson/internal/AnnotationIntrospector.java
index a03674f..432c7fe 100644
--- a/src/main/java/org/eclipse/yasson/internal/AnnotationIntrospector.java
+++ b/src/main/java/org/eclipse/yasson/internal/AnnotationIntrospector.java
@@ -38,6 +38,9 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.OptionalDouble;
+import java.util.OptionalInt;
+import java.util.OptionalLong;
 import java.util.Queue;
 import java.util.Set;
 
@@ -70,6 +73,7 @@
 import org.eclipse.yasson.internal.model.customization.ClassCustomizationBuilder;
 import org.eclipse.yasson.internal.properties.MessageKeys;
 import org.eclipse.yasson.internal.properties.Messages;
+import org.eclipse.yasson.internal.serializer.DefaultSerializers;
 import org.eclipse.yasson.internal.serializer.JsonbDateFormatter;
 import org.eclipse.yasson.internal.serializer.JsonbNumberFormatter;
 
@@ -351,6 +355,13 @@
         if (jsonbNillable != null) {
             return jsonbNillable.value();
         }
+        Class<?> clazz = clazzElement.getElement();
+        if (clazz == Optional.class
+                || clazz == OptionalDouble.class
+                || clazz == OptionalInt.class 
+                || clazz == OptionalLong.class) {
+            return true;
+        }
         return jsonbContext.getConfigProperties().getConfigNullable();
     }
 
@@ -748,6 +759,10 @@
      */
     public JsonbAnnotatedElement<Class<?>> collectAnnotations(Class<?> clazz) {
         JsonbAnnotatedElement<Class<?>> classElement = new JsonbAnnotatedElement<>(clazz);
+        
+        if (DefaultSerializers.getInstance().isKnownType(clazz)) {
+            return classElement;
+        }
 
         for (Class<?> ifc : collectInterfaces(clazz)) {
             addIfNotPresent(classElement, ifc.getDeclaredAnnotations());
diff --git a/src/main/java/org/eclipse/yasson/internal/MappingContext.java b/src/main/java/org/eclipse/yasson/internal/MappingContext.java
index ef3b257..944736d 100644
--- a/src/main/java/org/eclipse/yasson/internal/MappingContext.java
+++ b/src/main/java/org/eclipse/yasson/internal/MappingContext.java
@@ -22,6 +22,7 @@
 import org.eclipse.yasson.internal.model.JsonbAnnotatedElement;
 import org.eclipse.yasson.internal.model.customization.ClassCustomization;
 import org.eclipse.yasson.internal.serializer.ContainerSerializerProvider;
+import org.eclipse.yasson.internal.serializer.DefaultSerializers;
 
 /**
  * JSONB mappingContext. Created once per {@link javax.json.bind.Jsonb} instance. Represents a global scope.
@@ -92,7 +93,9 @@
                                                       customization,
                                                       parentClassModel,
                                                       jsonbContext.getConfigProperties().getPropertyNamingStrategy());
-            classParser.parseProperties(newClassModel, clsElement);
+            if (!DefaultSerializers.getInstance().isKnownType(aClass)) {
+                classParser.parseProperties(newClassModel, clsElement);
+            }
             return newClassModel;
         };
     }
diff --git a/src/main/java/org/eclipse/yasson/internal/Marshaller.java b/src/main/java/org/eclipse/yasson/internal/Marshaller.java
index 0416b18..00f44fc 100644
--- a/src/main/java/org/eclipse/yasson/internal/Marshaller.java
+++ b/src/main/java/org/eclipse/yasson/internal/Marshaller.java
@@ -29,7 +29,6 @@
 import org.eclipse.yasson.internal.properties.Messages;
 import org.eclipse.yasson.internal.serializer.AbstractValueTypeSerializer;
 import org.eclipse.yasson.internal.serializer.ContainerSerializerProvider;
-import org.eclipse.yasson.internal.serializer.DefaultSerializers;
 import org.eclipse.yasson.internal.serializer.SerializerBuilder;
 
 /**
@@ -159,10 +158,8 @@
                 .withObjectClass(rootClazz)
                 .withType(runtimeType);
 
-        if (!DefaultSerializers.getInstance().isKnownType(rootClazz)) {
-            ClassModel classModel = getMappingContext().getOrCreateClassModel(rootClazz);
-            serializerBuilder.withCustomization(classModel.getClassCustomization());
-        }
+        ClassModel classModel = getMappingContext().getOrCreateClassModel(rootClazz);
+        serializerBuilder.withCustomization(classModel.getClassCustomization());
         return serializerBuilder.build();
     }
     
diff --git a/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java b/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java
index a1d786a..f93cb56 100644
--- a/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java
+++ b/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java
@@ -246,7 +246,7 @@
                     declaredConstructor.setAccessible(true);
                 }
                 return declaredConstructor;
-            } catch (NoSuchMethodException e) {
+            } catch (NoSuchMethodException | RuntimeException e) {
                 if (required) {
                     throw new JsonbException(Messages.getMessage(MessageKeys.NO_DEFAULT_CONSTRUCTOR, clazz), e);
                 }
diff --git a/src/main/java/org/eclipse/yasson/internal/Unmarshaller.java b/src/main/java/org/eclipse/yasson/internal/Unmarshaller.java
index a0c824d..047235d 100644
--- a/src/main/java/org/eclipse/yasson/internal/Unmarshaller.java
+++ b/src/main/java/org/eclipse/yasson/internal/Unmarshaller.java
@@ -22,7 +22,6 @@
 import org.eclipse.yasson.internal.model.ClassModel;
 import org.eclipse.yasson.internal.properties.MessageKeys;
 import org.eclipse.yasson.internal.properties.Messages;
-import org.eclipse.yasson.internal.serializer.DefaultSerializers;
 import org.eclipse.yasson.internal.serializer.DeserializerBuilder;
 
 /**
@@ -58,11 +57,8 @@
             DeserializerBuilder deserializerBuilder = new DeserializerBuilder(getJsonbContext())
                     .withType(type).withJsonValueType(getRootEvent(parser));
             Class<?> rawType = ReflectionUtils.getRawType(type);
-            if (!DefaultSerializers.getInstance().isKnownType(rawType)) {
-                ClassModel classModel = getMappingContext().getOrCreateClassModel(rawType);
-                deserializerBuilder.withCustomization(classModel.getClassCustomization());
-            }
-
+            ClassModel classModel = getMappingContext().getOrCreateClassModel(rawType);
+            deserializerBuilder.withCustomization(classModel.getClassCustomization());
             return (T) deserializerBuilder.build().deserialize(parser, this, type);
         } catch (JsonbException e) {
             LOGGER.severe(e.getMessage());
diff --git a/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java b/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
index a4aa4ae..e1ec491 100644
--- a/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
+++ b/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
@@ -24,6 +24,7 @@
 import javax.json.bind.JsonbBuilder;
 import javax.json.bind.JsonbConfig;
 import javax.json.bind.adapter.JsonbAdapter;
+
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.time.Instant;
@@ -554,4 +555,30 @@
                 afterJson);
         assertEquals(1, throwableAdapter.callCount);
     }
+    
+    public static class StringAdapter implements JsonbAdapter<String, String> {
+		@Override
+		public String adaptToJson(String obj) throws Exception {
+			return obj.toUpperCase();
+		}
+
+		@Override
+		public String adaptFromJson(String obj) throws Exception {
+			return obj.toLowerCase();
+		}
+    }
+    
+    /**
+     * Test for: https://github.com/eclipse-ee4j/yasson/issues/346
+     */
+    @Test
+    public void testAdaptedRootType() {
+    	Jsonb jsonb = JsonbBuilder.newBuilder()
+    			.withConfig(new JsonbConfig().withAdapters(new StringAdapter()))
+    			.build();
+    	
+    	String original = "hello world!";
+    	assertEquals("\"HELLO WORLD!\"", jsonb.toJson(original));
+    	assertEquals(original, jsonb.fromJson("\"HELLO WORLD!\"", String.class));
+    }
 }