BRMS工作台XLS决策表转向导式决策表触发空指针异常
Troubleshooting XLS to Guided Decision Table Conversion Issues in BRMS
Let’s walk through actionable steps to diagnose and fix the NullPointerException during indexing and missing THEN clauses you’re encountering:
1. Validate Fact Class References in Your XLS
The NullPointerException in GuidedRuleModelIndexVisitor.getFullyQualifiedClassName() directly points to a problem resolving the full path of a Fact class used in your rules.
- Double-check that all Fact references in the WHEN section use their complete package path (e.g.,
org.crossvale.jbpms.multiplicationtable.MultiplicationTableinstead of justMultiplicationTable). - Confirm these Fact classes exist in your BRMS project’s classpath—if they’re missing or not properly indexed, the conversion process can’t resolve them, triggering the NPE.
2. Audit XLS Decision Table Format Compliance
BRMS relies on strict formatting for spreadsheet decision tables; even small inconsistencies can break conversion:
- Verify header keywords like
RuleSet,WHEN, andTHENare spelled correctly and placed in the right rows/columns. - Check the syntax of your THEN actions—ensure they follow Drools syntax exactly (e.g.,
modify($table){ setResult(10) }orinsert(new Result())). Missing braces, variables, or method names can cause the conversion to drop the THEN block entirely. - Remove any empty rows or malformed cells between rule rows—these can confuse the parser.
3. Verify Project Indexing and Class Deployment
- After uploading your Fact classes, trigger a full project rebuild in BRMS. Sometimes the indexing service needs a refresh to recognize new or updated classes.
- Check the BRMS server logs for earlier warnings about unresolvable classes or missing metadata—these often appear before the NPE and can pinpoint which Fact is causing the issue.
4. Test with a Minimal Decision Table
Isolate the problem by creating a simplified XLS table:
- Start with 1 rule, a single WHEN condition (using a confirmed valid Fact), and a simple THEN action.
- Convert this to GDST. If it works, gradually add back your original rules one by one to identify which specific rule or condition is triggering the error.
5. Check BRMS Version for Known Bugs
The stack trace points to the GuidedDecisionTableFileIndexer, which has had bug fixes in various Drools/BRMS versions:
- Verify if your BRMS version has reported issues with XLS to GDST conversion (especially around indexing and NullPointerException). If so, apply the relevant patch or upgrade to a newer stable version.
6. Inspect the Generated GDST Source
- In BRMS, navigate to the converted
.gdstfile and view its raw XML source. - Compare the XML’s
<whenConstraints>and<thenActions>sections to the original XLS rule source. Look for missing elements in the THEN section—this can show if the conversion process failed to parse specific actions.
Relevant Error Log (For Reference)
12:36:32,273 ERROR [org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedDecisionTableFileIndexer] (EJB default - 10) Unable to index 'default://master@tavant/scholarship/src/main/resources/org/crossvale/jbpms/multiplicationtable/MultiplicationTableOfTwo%20(converted%20on%2005-Jan-2018%2012-36-32).gdst'.: java.lang.NullPointerException at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedRuleModelIndexVisitor.getFullyQualifiedClassName(GuidedRuleModelIndexVisitor.java:247) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedRuleModelIndexVisitor.visitSingleFieldConstraint(GuidedRuleModelIndexVisitor.java:214) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedRuleModelIndexVisitor.visit(GuidedRuleModelIndexVisitor.java:84) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedRuleModelIndexVisitor.visitFactPattern(GuidedRuleModelIndexVisitor.java:147) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedRuleModelIndexVisitor.visit(GuidedRuleModelIndexVisitor.java:78) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedRuleModelIndexVisitor.visitRuleModel(GuidedRuleModelIndexVisitor.java:182) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedRuleModelIndexVisitor.visit(GuidedRuleModelIndexVisitor.java:74) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedRuleModelIndexVisitor.visit(GuidedRuleModelIndexVisitor.java:68) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedDecisionTableModelIndexVisitor.visit(GuidedDecisionTableModelIndexVisitor.java:142) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedDecisionTableModelIndexVisitor.visit(GuidedDecisionTableModelIndexVisitor.java:82) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedDecisionTableModelIndexVisitor.visit(GuidedDecisionTableModelIndexVisitor.java:101) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedDecisionTableModelIndexVisitor.visit(GuidedDecisionTableModelIndexVisitor.java:69) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedDecisionTableFileIndexer.toKObject(GuidedDecisionTableFileIndexer.java:74) at org.drools.workbench.screens.guided.dtable.backend.server.indexing.GuidedDecisionTableFileIndexer$Proxy$_$$_WeldClientProxy.toKObject(Unknown Source) at org.uberfire.ext.metadata.io.IOServiceIndexedImpl$1$1.run(IOServiceIndexedImpl.java:290) at org.uberfire.commons.async.SimpleAsyncExecutorService.execute(SimpleAsyncExecutorService.java:137) at sun.reflect.GeneratedMethodAccessor227.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437) at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:82) at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:93) at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437) at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:73) at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.singleton.SingletonComponentInstanceAssociationInterceptor.processInvocation(SingletonComponentInstanceAssociationInterceptor.java:53) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInNoTx(CMTTxInterceptor.java:263) at org.jboss.as.ejb3.tx.CMTTxInterceptor.notSupported(CMTTxInterceptor.java:313) at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:237) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:43) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:100) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437) at org.jboss.as.ejb3.concurrency.ContainerManagedConcurrencyInterceptor.processInvocation(ContainerManagedConcurrencyInterceptor.java:110) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:66) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:636) at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:61) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:195) at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:185) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.LogDiagnosticContextRecoveryInterceptor.processInvocation(LogDiagnosticContextRecoveryInterceptor.java:82) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.AsyncFutureInterceptorFactory$1$2.runInvocation(AsyncFutureInterceptorFactory.java:101) at org.jboss.as.ejb3.component.interceptors.AsyncInvocationTask.run(AsyncInvocationTask.java:74) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) at org.jboss.threads.JBossThread.run(JBossThread.java:320)
内容的提问来源于stack exchange,提问作者Rupesh
相关产品推荐
相关产品推荐

