This is an automated email from the ASF dual-hosted git repository. exceptionfactory pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push: new 9c425d273c NIFI-12131 Fixed potential NPE related to FlowAnalyzer 9c425d273c is described below commit 9c425d273c8b11d9a3ba74bdabe620cff2617b42 Author: Tamas Palfy <tpa...@apache.org> AuthorDate: Thu Sep 28 16:09:34 2023 +0200 NIFI-12131 Fixed potential NPE related to FlowAnalyzer Revamped RuleViolationsManager and FlowAnalyzer handling to make sure no issue occurs when these are not set. Fix ResourceNotFoundException: When determining the subject permissions for a rule violation the type of the subject is now known, so we try to lookup all possible types. Non-matching tpyes throw a ResourceNotFoundException exception though. Going to ignore those. This closes #7809 Signed-off-by: David Handermann <exceptionfact...@apache.org> --- .../nifi/controller/flow/AbstractFlowManager.java | 27 +++++++++------ .../service/StandardControllerServiceNode.java | 3 +- .../service/StandardControllerServiceProvider.java | 4 ++- .../StandardValidationContextFactory.java | 9 ++--- .../nifi/controller/AbstractComponentNode.java | 6 ++-- .../org/apache/nifi/controller/ProcessorNode.java | 4 +-- .../nifi/controller/ValidationContextFactory.java | 5 +-- .../apache/nifi/controller/flow/FlowManager.java | 4 +-- .../org/apache/nifi/controller/FlowController.java | 38 ++++++++++++++-------- .../nifi/controller/flow/StandardFlowManager.java | 18 ++++++---- .../apache/nifi/web/StandardNiFiServiceFacade.java | 14 +++++--- 11 files changed, 79 insertions(+), 53 deletions(-) diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/flow/AbstractFlowManager.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/flow/AbstractFlowManager.java index 38dde287a9..4a8a714398 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/flow/AbstractFlowManager.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/flow/AbstractFlowManager.java @@ -59,6 +59,7 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -124,7 +125,7 @@ public abstract class AbstractFlowManager implements FlowManager { String identifier = group.getIdentifier(); allProcessGroups.remove(identifier); - ruleViolationsManager.removeRuleViolationsForSubject(identifier); + removeRuleViolationsForSubject(identifier); } public void onProcessorAdded(final ProcessorNode procNode) { @@ -137,7 +138,7 @@ public abstract class AbstractFlowManager implements FlowManager { allProcessors.remove(identifier); pythonBridge.onProcessorRemoved(identifier, procNode.getComponentType(), procNode.getBundleCoordinate().getVersion()); - ruleViolationsManager.removeRuleViolationsForSubject(identifier); + removeRuleViolationsForSubject(identifier); } public Set<ProcessorNode> findAllProcessors(final Predicate<ProcessorNode> filter) { @@ -197,7 +198,7 @@ public abstract class AbstractFlowManager implements FlowManager { flowFileEventRepository.purgeTransferEvents(identifier); allConnections.remove(identifier); - ruleViolationsManager.removeRuleViolationsForSubject(identifier); + removeRuleViolationsForSubject(identifier); } public Connection getConnection(final String id) { @@ -353,7 +354,7 @@ public abstract class AbstractFlowManager implements FlowManager { flowFileEventRepository.purgeTransferEvents(identifier); allInputPorts.remove(identifier); - ruleViolationsManager.removeRuleViolationsForSubject(identifier); + removeRuleViolationsForSubject(identifier); } public Port getInputPort(final String id) { @@ -369,7 +370,7 @@ public abstract class AbstractFlowManager implements FlowManager { flowFileEventRepository.purgeTransferEvents(identifier); allOutputPorts.remove(identifier); - ruleViolationsManager.removeRuleViolationsForSubject(identifier); + removeRuleViolationsForSubject(identifier); } public Port getOutputPort(final String id) { @@ -385,7 +386,7 @@ public abstract class AbstractFlowManager implements FlowManager { flowFileEventRepository.purgeTransferEvents(identifier); allFunnels.remove(identifier); - ruleViolationsManager.removeRuleViolationsForSubject(identifier); + removeRuleViolationsForSubject(identifier); } public Funnel getFunnel(final String id) { @@ -686,12 +687,18 @@ public abstract class AbstractFlowManager implements FlowManager { protected abstract Authorizable getParameterContextParent(); @Override - public FlowAnalyzer getFlowAnalyzer() { - return flowAnalyzer; + public Optional<FlowAnalyzer> getFlowAnalyzer() { + return Optional.ofNullable(flowAnalyzer); } @Override - public RuleViolationsManager getRuleViolationsManager() { - return ruleViolationsManager; + public Optional<RuleViolationsManager> getRuleViolationsManager() { + return Optional.ofNullable(ruleViolationsManager); + } + + private void removeRuleViolationsForSubject(String identifier) { + if (ruleViolationsManager != null) { + ruleViolationsManager.removeRuleViolationsForSubject(identifier); + } } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java index 7b1bc9794b..e7601470e2 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java @@ -835,7 +835,6 @@ public class StandardControllerServiceNode extends AbstractComponentNode impleme @Override protected void performFlowAnalysisOnThis() { - Optional.ofNullable(getValidationContextFactory().getFlowAnalyzer()) - .ifPresent(flowAnalyzer -> flowAnalyzer.analyzeControllerService(this)); + getValidationContextFactory().getFlowAnalyzer().ifPresent(flowAnalyzer -> flowAnalyzer.analyzeControllerService(this)); } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java index c6420e4ecf..89c7a47b2d 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java @@ -683,7 +683,9 @@ public class StandardControllerServiceProvider implements ControllerServiceProvi extensionManager.removeInstanceClassLoader(serviceNode.getIdentifier()); serviceCache.remove(serviceNode.getIdentifier()); - flowManager.getRuleViolationsManager().removeRuleViolationsForSubject(serviceNode.getIdentifier()); + flowManager.getRuleViolationsManager().ifPresent( + ruleViolationsManager -> ruleViolationsManager.removeRuleViolationsForSubject(serviceNode.getIdentifier()) + ); } @Override diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/processor/StandardValidationContextFactory.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/processor/StandardValidationContextFactory.java index 86494f3e8a..09f23d12b9 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/processor/StandardValidationContextFactory.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/processor/StandardValidationContextFactory.java @@ -26,6 +26,7 @@ import org.apache.nifi.parameter.ParameterContext; import org.apache.nifi.validation.RuleViolationsManager; import java.util.Map; +import java.util.Optional; public class StandardValidationContextFactory implements ValidationContextFactory { @@ -54,12 +55,12 @@ public class StandardValidationContextFactory implements ValidationContextFactor } @Override - public RuleViolationsManager getRuleViolationsManager() { - return ruleViolationsManager; + public Optional<RuleViolationsManager> getRuleViolationsManager() { + return Optional.ofNullable(ruleViolationsManager); } @Override - public FlowAnalyzer getFlowAnalyzer() { - return flowAnalyzer; + public Optional<FlowAnalyzer> getFlowAnalyzer() { + return Optional.ofNullable(flowAnalyzer); } } \ No newline at end of file diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java index 0d1dc222eb..598444a2ed 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java @@ -62,7 +62,6 @@ import org.apache.nifi.util.CharacterFilterUtils; import org.apache.nifi.util.FormatUtils; import org.apache.nifi.util.file.classloader.ClassLoaderUtils; import org.apache.nifi.validation.RuleViolation; -import org.apache.nifi.validation.RuleViolationsManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -789,8 +788,7 @@ public abstract class AbstractComponentNode implements ComponentNode { performFlowAnalysisOnThis(); - RuleViolationsManager ruleViolationsManager = getValidationContextFactory().getRuleViolationsManager(); - if (ruleViolationsManager != null) { + getValidationContextFactory().getRuleViolationsManager().ifPresent(ruleViolationsManager -> { Collection<RuleViolation> ruleViolations = ruleViolationsManager.getRuleViolationsForSubject(getIdentifier()); for (RuleViolation ruleViolation : ruleViolations) { if (ruleViolation.getEnforcementPolicy() == EnforcementPolicy.ENFORCE) { @@ -803,7 +801,7 @@ public abstract class AbstractComponentNode implements ComponentNode { ); } } - } + }); logger.debug("Computed validation errors with Validation Context {}; results = {}", validationContext, validationResults); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ProcessorNode.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ProcessorNode.java index de76b959c5..ae95db36bd 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ProcessorNode.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ProcessorNode.java @@ -36,7 +36,6 @@ import org.apache.nifi.scheduling.SchedulingStrategy; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ScheduledExecutorService; @@ -286,8 +285,7 @@ public abstract class ProcessorNode extends AbstractComponentNode implements Con @Override protected void performFlowAnalysisOnThis() { - Optional.ofNullable(getValidationContextFactory().getFlowAnalyzer()) - .ifPresent(flowAnalyzer -> flowAnalyzer.analyzeProcessor(this)); + getValidationContextFactory().getFlowAnalyzer().ifPresent(flowAnalyzer -> flowAnalyzer.analyzeProcessor(this)); } /** diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ValidationContextFactory.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ValidationContextFactory.java index cbab247e13..96806fca1d 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ValidationContextFactory.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ValidationContextFactory.java @@ -23,13 +23,14 @@ import org.apache.nifi.parameter.ParameterContext; import org.apache.nifi.validation.RuleViolationsManager; import java.util.Map; +import java.util.Optional; public interface ValidationContextFactory { ValidationContext newValidationContext(Map<PropertyDescriptor, PropertyConfiguration> properties, String annotationData, String groupId, String componentId, ParameterContext parameterContext, boolean validateConnections); - RuleViolationsManager getRuleViolationsManager(); + Optional<RuleViolationsManager> getRuleViolationsManager(); - FlowAnalyzer getFlowAnalyzer(); + Optional<FlowAnalyzer> getFlowAnalyzer(); } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java index 921d2ee6e3..d045cb598c 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java @@ -435,7 +435,7 @@ public interface FlowManager extends ParameterProviderLookup { Set<FlowAnalysisRuleNode> getAllFlowAnalysisRules(); - FlowAnalyzer getFlowAnalyzer(); + Optional<FlowAnalyzer> getFlowAnalyzer(); - RuleViolationsManager getRuleViolationsManager(); + Optional<RuleViolationsManager> getRuleViolationsManager(); } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java index 087e2b9d99..48d738201a 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java @@ -562,11 +562,15 @@ public class FlowController implements ReportingTaskProvider, FlowAnalysisRulePr repositoryContextFactory = new RepositoryContextFactory(contentRepository, flowFileRepository, flowFileEventRepository, counterRepositoryRef.get(), provenanceRepository, stateManagerProvider); this.flowAnalysisThreadPool = new FlowEngine(1, "Background Flow Analysis", true); - flowAnalyzer = new StandardFlowAnalyzer( + if (ruleViolationsManager != null) { + flowAnalyzer = new StandardFlowAnalyzer( ruleViolationsManager, this, extensionManager - ); + ); + } else { + flowAnalyzer = null; + } flowManager = new StandardFlowManager( nifiProperties, @@ -600,7 +604,9 @@ public class FlowController implements ReportingTaskProvider, FlowAnalysisRulePr flowAnalyzer, ruleViolationsManager ); - flowAnalyzer.initialize(controllerServiceProvider); + if (flowAnalyzer != null) { + flowAnalyzer.initialize(controllerServiceProvider); + } final QuartzSchedulingAgent quartzSchedulingAgent = new QuartzSchedulingAgent(this, timerDrivenEngineRef.get(), repositoryContextFactory); final TimerDrivenSchedulingAgent timerDrivenAgent = new TimerDrivenSchedulingAgent(this, timerDrivenEngineRef.get(), repositoryContextFactory, this.nifiProperties); @@ -1204,7 +1210,9 @@ public class FlowController implements ReportingTaskProvider, FlowAnalysisRulePr } }; - new TriggerFlowAnalysisTask(flowAnalyzer, rootProcessGroupSupplier).run(); + if (flowAnalyzer != null) { + new TriggerFlowAnalysisTask(flowAnalyzer, rootProcessGroupSupplier).run(); + } new TriggerValidationTask(flowManager, triggerIfValidating).run(); final long millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start); @@ -1288,17 +1296,19 @@ public class FlowController implements ReportingTaskProvider, FlowAnalysisRulePr } private void scheduleBackgroundFlowAnalysis(Supplier<VersionedProcessGroup> rootProcessGroupSupplier) { - try { - final long scheduleMillis = parseDurationPropertyToMillis(NiFiProperties.BACKGROUND_FLOW_ANALYSIS_SCHEDULE); + if (flowAnalyzer != null) { + try { + final long scheduleMillis = parseDurationPropertyToMillis(NiFiProperties.BACKGROUND_FLOW_ANALYSIS_SCHEDULE); - flowAnalysisThreadPool.scheduleWithFixedDelay( - new TriggerFlowAnalysisTask(flowManager.getFlowAnalyzer(), rootProcessGroupSupplier), - scheduleMillis, - scheduleMillis, - TimeUnit.MILLISECONDS - ); - } catch (Exception e) { - LOG.warn("Could not initialize TriggerFlowAnalysisTask.", e); + flowAnalysisThreadPool.scheduleWithFixedDelay( + new TriggerFlowAnalysisTask(flowAnalyzer, rootProcessGroupSupplier), + scheduleMillis, + scheduleMillis, + TimeUnit.MILLISECONDS + ); + } catch (Exception e) { + LOG.warn("Could not initialize TriggerFlowAnalysisTask.", e); + } } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java index ce6272e02e..69599dc0fd 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java @@ -351,8 +351,8 @@ public class StandardFlowManager extends AbstractFlowManager implements FlowMana .addClasspathUrls(additionalUrls) .kerberosConfig(flowController.createKerberosConfig(nifiProperties)) .extensionManager(extensionManager) - .flowAnalyzer(getFlowAnalyzer()) - .ruleViolationsManager(getRuleViolationsManager()) + .flowAnalyzer(getFlowAnalyzer().orElse(null)) + .ruleViolationsManager(getRuleViolationsManager().orElse(null)) .classloaderIsolationKey(classloaderIsolationKey) .pythonBridge(flowController.getPythonBridge()) .buildProcessor(); @@ -557,8 +557,8 @@ public class StandardFlowManager extends AbstractFlowManager implements FlowMana .kerberosConfig(flowController.createKerberosConfig(nifiProperties)) .flowController(flowController) .extensionManager(extensionManager) - .flowAnalyzer(getFlowAnalyzer()) - .ruleViolationsManager(getRuleViolationsManager()) + .flowAnalyzer(getFlowAnalyzer().orElse(null)) + .ruleViolationsManager(getRuleViolationsManager().orElse(null)) .classloaderIsolationKey(classloaderIsolationKey) .buildFlowAnalysisRuleNode(); @@ -693,7 +693,11 @@ public class StandardFlowManager extends AbstractFlowManager implements FlowMana processScheduler.submitFrameworkTask(() -> flowController.getStateManagerProvider().onComponentRemoved(service.getIdentifier())); - processScheduler.submitFrameworkTask(() -> getRuleViolationsManager().removeRuleViolationsForSubject(service.getIdentifier())); + getRuleViolationsManager().ifPresent( + ruleViolationsManager -> processScheduler.submitFrameworkTask( + () -> ruleViolationsManager.removeRuleViolationsForSubject(service.getIdentifier()) + ) + ); extensionManager.removeInstanceClassLoader(service.getIdentifier()); @@ -720,8 +724,8 @@ public class StandardFlowManager extends AbstractFlowManager implements FlowMana .kerberosConfig(flowController.createKerberosConfig(nifiProperties)) .stateManagerProvider(flowController.getStateManagerProvider()) .extensionManager(extensionManager) - .flowAnalyzer(getFlowAnalyzer()) - .ruleViolationsManager(getRuleViolationsManager()) + .flowAnalyzer(getFlowAnalyzer().orElse(null)) + .ruleViolationsManager(getRuleViolationsManager().orElse(null)) .classloaderIsolationKey(classloaderIsolationKey) .buildControllerService(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java index 8bce1a43d9..a09aff5dce 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java @@ -6307,7 +6307,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { controllerFacade.getControllerServiceProvider() ); - controllerFacade.getFlowManager().getFlowAnalyzer().analyzeProcessGroup(nonVersionedProcessGroup); + controllerFacade.getFlowManager().getFlowAnalyzer().ifPresent( + flowAnalyzer -> flowAnalyzer.analyzeProcessGroup(nonVersionedProcessGroup) + ); } @Override @@ -6408,12 +6410,16 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } private Optional<AuthorizableHolder> findAuthorizableHolder( - String id, - Function<String, AuthorizableHolder>... lookupMethods + final String id, + final Function<String, AuthorizableHolder>... lookupMethods ) { AuthorizableHolder authorizableHolder = null; for (Function<String, AuthorizableHolder> lookupMethod : lookupMethods) { - authorizableHolder = lookupMethod.apply(id); + try { + authorizableHolder = lookupMethod.apply(id); + } catch (ResourceNotFoundException e) { + // We don't know beforehand what kind of component we are looking for. Ignore if one lookup fails. + } if (authorizableHolder != null) { break; }