Skip to content

Prefer primary Json(De)Serializer.None over secondary null in AnnotationIntrospectorPair.find(De)Serializer #1584

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
TuomasKiviaho opened this issue Mar 30, 2017 · 1 comment

Comments

@TuomasKiviaho
Copy link

Now that the #1581 took care of the twisted behavior of _isExplicitClassOrOb, I feel confident in what I'm doing :-)

I'm evaluating a JaxbAnnotationIntrospector change below that might cause side effects and be a bad idea after all but...

     @Override
-    public JsonSerializer<?> findSerializer(Annotated am)
+    public Object findSerializer(Annotated am)
     {
 ...
-        return null;
+        return JsonSerializer.None.class;
     }

... nevertheless I found out that the Json(De)Serializer.None is a nifty class that can't currently be utilized with AnnotationIntrospectorPair when the secondary introspector usually just returns null. This patch below changes this behaviour so that the primary implicit/missing/bogus is preferred over the secondary one.

     @Override
     public Object findSerializer(Annotated am) {
         Object r = _primary.findSerializer(am);
-        return _isExplicitClassOrOb(r, JsonSerializer.None.class)
-                ? r : _secondary.findSerializer(am);
+        if (!_isExplicitClassOrOb(r, JsonSerializer.None.class)) {
+            Object r2 = _secondary.findSerializer(am);
+            if (_isExplicitClassOrOb(r2, JsonSerializer.None.class)) {
+                r = r2;
+            }
+        }
+        return r;
     }
     
     @Override
     public Object findKeySerializer(Annotated a) {
         Object r = _primary.findKeySerializer(a);
-        return _isExplicitClassOrOb(r, JsonSerializer.None.class)
-                ? r : _secondary.findKeySerializer(a);
+        if (!_isExplicitClassOrOb(r, JsonSerializer.None.class)) {
+            Object r2 = _secondary.findKeySerializer(a);
+            if (_isExplicitClassOrOb(r2, JsonSerializer.None.class)) {
+                r = r2;
+            }
+        }
+        return r;
     }
 
     @Override
     public Object findContentSerializer(Annotated a) {
         Object r = _primary.findContentSerializer(a);
-        return _isExplicitClassOrOb(r, JsonSerializer.None.class)
-                ? r : _secondary.findContentSerializer(a);
+        if (!_isExplicitClassOrOb(r, JsonSerializer.None.class)) {
+            Object r2 = _secondary.findContentSerializer(a);
+            if (_isExplicitClassOrOb(r2, JsonSerializer.None.class)) {
+                r = r2;
+            }
+        }
+        return r;
     }
     
     @Override
     public Object findNullSerializer(Annotated a) {
         Object r = _primary.findNullSerializer(a);
-        return _isExplicitClassOrOb(r, JsonSerializer.None.class)
-                ? r : _secondary.findNullSerializer(a);
+        if (!_isExplicitClassOrOb(r, JsonSerializer.None.class)) {
+            Object r2 = _secondary.findNullSerializer(a);
+            if (_isExplicitClassOrOb(r2, JsonSerializer.None.class)) {
+                r = r2;
+            }
+        }
+        return r;
     }
     
     @Deprecated
@@ -626,22 +646,37 @@ public class AnnotationIntrospectorPair
     @Override
     public Object findDeserializer(Annotated am) {
         Object r = _primary.findDeserializer(am);
-        return _isExplicitClassOrOb(r, JsonDeserializer.None.class)
-                ? r : _secondary.findDeserializer(am);
+        if (!_isExplicitClassOrOb(r, JsonDeserializer.None.class)) {
+            Object r2 = _secondary.findDeserializer(am);
+            if (_isExplicitClassOrOb(r2, JsonDeserializer.None.class)) {
+                r = r2;
+            }
+        }
+        return r;
     }
 
     @Override
     public Object findKeyDeserializer(Annotated am) {
         Object r = _primary.findKeyDeserializer(am);
-        return _isExplicitClassOrOb(r, KeyDeserializer.None.class)
-                ? r : _secondary.findKeyDeserializer(am);
+        if (!_isExplicitClassOrOb(r, JsonDeserializer.None.class)) {
+            Object r2 = _secondary.findKeyDeserializer(am);
+            if (_isExplicitClassOrOb(r2, JsonDeserializer.None.class)) {
+                r = r2;
+            }
+        }
+        return r;
     }
 
     @Override
     public Object findContentDeserializer(Annotated am) {
         Object r = _primary.findContentDeserializer(am);
-        return _isExplicitClassOrOb(r, JsonDeserializer.None.class)
-                ? r : _secondary.findContentDeserializer(am);
+        if (!_isExplicitClassOrOb(r, JsonDeserializer.None.class)) {
+            Object r2 = _secondary.findContentDeserializer(am);
+            if (_isExplicitClassOrOb(r2, JsonDeserializer.None.class)) {
+                r = r2;
+            }
+        }
+        return r;
     }
 
     @Override
@cowtowncoder
Copy link
Member

Ah yes, but of course you are right: check must be applied for all return values, not just first masking one. I'll go and improve test, fix this too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants