Skip to content

Commit 4deb0f5

Browse files
authored
Merge pull request #150 from SentryMan/log
More Logging for Custom Adapter Errors
2 parents ad840b0 + 7e9bbeb commit 4deb0f5

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

jsonb-generator/src/main/java/io/avaje/jsonb/generator/Processor.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,31 @@ private void registerCustomAdapters(Set<? extends Element> elements) {
7979
final var type = typeElement.getQualifiedName().toString();
8080
if (CustomAdapterPrism.getInstanceOn(typeElement).isGeneric()) {
8181
ElementFilter.fieldsIn(typeElement.getEnclosedElements()).stream()
82-
.filter(isStaticFactory())
83-
.findFirst()
84-
.orElseThrow(() -> new IllegalStateException("Generic Adapters require a public static JsonAdapter.Factory FACTORY field"));
82+
.filter(isStaticFactory())
83+
.findFirst()
84+
.ifPresentOrElse(
85+
x -> {},
86+
() ->
87+
logError(
88+
typeElement,
89+
"Generic adapters require a public static JsonAdapter.Factory FACTORY field"));
8590

8691
metaData.addFactory(type);
8792
} else {
93+
ElementFilter.constructorsIn(typeElement.getEnclosedElements()).stream()
94+
.filter(m -> m.getModifiers().contains(Modifier.PUBLIC))
95+
.filter(m -> m.getParameters().size() == 1)
96+
.map(m -> m.getParameters().get(0).asType().toString())
97+
.map(Util::trimAnnotations)
98+
.filter("io.avaje.jsonb.Jsonb"::equals)
99+
.findAny()
100+
.ifPresentOrElse(
101+
x -> {},
102+
() ->
103+
logError(
104+
typeElement,
105+
"Non-Generic adapters must have a public constructor with a single Jsonb parameter"));
106+
88107
metaData.add(type);
89108
}
90109
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/Util.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import javax.lang.model.element.TypeElement;
44

55
import static io.avaje.jsonb.generator.ProcessingContext.element;
6+
import static io.avaje.jsonb.generator.ProcessingContext.logError;
67

78
import java.util.ArrayList;
89
import java.util.List;
@@ -139,18 +140,29 @@ static String initLower(String name) {
139140

140141
/** Return the base type given the JsonAdapter type. */
141142
static String baseTypeOfAdapter(String adapterFullName) {
142-
TypeElement element = element(adapterFullName);
143+
final var element = element(adapterFullName);
143144
if (element == null) {
144145
throw new NullPointerException("Element not found for [" + adapterFullName + "]");
145146
}
146-
return element(adapterFullName).getInterfaces().stream()
147-
.filter(t -> t.toString().contains("io.avaje.jsonb.JsonAdapter"))
148-
.findFirst()
149-
.map(Object::toString)
150-
.map(GenericType::parse)
151-
.map(GenericType::firstParamType)
152-
.map(Util::extractTypeWithNest)
153-
.orElseThrow(() -> new IllegalStateException("Adapter: " + adapterFullName + " does not directly implement JsonAdapter"));
147+
return baseTypeOfAdapter(element);
148+
}
149+
150+
static String baseTypeOfAdapter(TypeElement element) {
151+
152+
return element.getInterfaces().stream()
153+
.filter(t -> t.toString().contains("io.avaje.jsonb.JsonAdapter"))
154+
.findFirst()
155+
.map(Object::toString)
156+
.map(GenericType::parse)
157+
.map(GenericType::firstParamType)
158+
.map(Util::extractTypeWithNest)
159+
.orElseGet(
160+
() -> {
161+
logError(
162+
element,
163+
"Custom Adapters must implement JsonAdapter");
164+
return "Invalid";
165+
});
154166
}
155167

156168
static String extractTypeWithNest(String fullType) {

0 commit comments

Comments
 (0)