From 1a40634c10b2a8f6bae98a2e490be27e9c76adb2 Mon Sep 17 00:00:00 2001 From: Bernardo Gomez Palacio Date: Mon, 18 Nov 2019 11:46:00 -0800 Subject: [PATCH] Cover against a null source provided by a Guice Element We are observing an edge case where a Guice Element returns a `null` source, see the reference of he error below. ``` Caused by: java.lang.NullPointerException at org.springframework.guice.annotation.ModuleRegistryConfiguration.lambda$null$0(ModuleRegistryConfiguration.java:197) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174) at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958) at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126) at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:499) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:486) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:531) at org.springframework.guice.annotation.ModuleRegistryConfiguration.lambda$postProcessBeanDefinitionRegistry$1(ModuleRegistryConfiguration.java:197) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566) at org.springframework.guice.annotation.ModuleRegistryConfiguration.postProcessBeanDefinitionRegistry(ModuleRegistryConfiguration.java:198) ``` --- .../annotation/ModuleRegistryConfiguration.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java b/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java index 406d256..9c4adee 100644 --- a/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java +++ b/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java @@ -52,6 +52,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; +import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -109,7 +111,7 @@ class ModuleRegistryConfiguration for (Entry, Binding> entry : bindings.entrySet()) { if (entry.getKey().getTypeLiteral().getRawType().equals(Injector.class) || SpringModule.SPRING_GUICE_SOURCE - .equals(entry.getValue().getSource().toString())) { + .equals(Optional.ofNullable(entry.getValue().getSource()).map(Object::toString).orElse(""))) { continue; } if (entry.getKey().getAnnotationType() != null && @@ -132,7 +134,7 @@ class ModuleRegistryConfiguration if(!Scopes.isSingleton(binding)) { bean.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE); } - if (source != null && source instanceof ElementSource) { + if (source instanceof ElementSource) { bean.setResourceDescription( ((ElementSource) source).getDeclaringSource().toString()); } @@ -193,8 +195,8 @@ class ModuleRegistryConfiguration String[] modulesToFilter = applicationContext.getEnvironment() .getProperty("spring.guice.modules.exclude").split(","); elements = elements.stream() - .filter(e -> !Arrays.stream(modulesToFilter) - .filter(ex -> (e.getSource().toString().contains(ex))).findFirst().isPresent()) + .filter(e -> Arrays.stream(modulesToFilter) + .noneMatch(ex -> (Optional.ofNullable(e.getSource()).map(Object::toString).orElse("").contains(ex)))) .collect(Collectors.toList()); modules = Collections.singletonList(Elements.getModule(elements)); } @@ -268,10 +270,10 @@ class ModuleRegistryConfiguration Binding compareTo = (Binding) obj; if (compareTo.getSource() != null && this.binding != null) { return binding.equals(compareTo) - && binding.getSource().equals(compareTo.getSource()); + && Objects.equals(binding.getSource(), compareTo.getSource()); } else { - return binding.equals(compareTo); + return Objects.equals(binding, compareTo); } } else {