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));
+ }
}