title: RuntimeException: Unexpected global[] in Drools
body: <p>I'm facing a problem using Spring with Drools. My main problem is that in the unit tests do not occur the error. Follows below the exception</p>
  
  <pre><code>java.lang.RuntimeException: Unexpected global [premioService]
  </code></pre>
  
  <p>This error occurs when I try to set a global variable in KieSession
  Seeing the method StatefulKnowledgeSessionImpl#setGlobal(String, Object) seems that I should set the 
  globals before create a newInstance. Follows the StatefulKnowledgeSessionImpl#setGlobal code:</p>
  
  <pre><code>    public void setGlobal(final String identifier,
                        final Object value) {
      // Cannot set null values
      if ( value == null ) {
          return;
      }
  
      try {
          this.kBase.readLock();
          startOperation();
          // Make sure the global has been declared in the RuleBase
          final Map globalDefintions = this.kBase.getGlobals();
          final Class type = (Class) globalDefintions.get( identifier );
          if ( (type == null) ) {
              throw new RuntimeException( "Unexpected global [" + identifier + "]" );
          } else if ( !type.isInstance( value ) ) {
              throw new RuntimeException( "Illegal class for global. " + "Expected [" + type.getName() + "], " + "found [" + value.getClass().getName() + "]." );
  
          } else {
              this.globalResolver.setGlobal( identifier,
                                             value );
          }
      } finally {
          endOperation();
          this.kBase.readUnlock();
      }
  }
  </code></pre>
  
  <p>Follows my code:</p>
  
  <pre><code>@Inject
  protected PremioVisaoService premioVisaoService;
  
  protected final KieSession createSession() {
      return this.kieBase.newKieSession();
  }
  protected final int process() {
      final KieSession kieSession = this.createSession();
      Object rulesFired = 0;
  
      try {
          //here occurs the error
          kieSession.execute(CommandFactory.newSetGlobal(PREMIO_SERVICE_GLOBAL_ID, premioVisaoService));           
      } catch(Exception e) {
          e.printStackTrace();
      }
  }
  
  
  
  
      package br.com.company.brms.model.rules;
  
  import br.com.company.brms.model.*;
  import br.com.company.brms.model.premios.*;
  import br.com.company.brms.model.tarifas.*;
  
  import function br.com.company.brms.helpers.DomainUtils.getPais;
  import function br.com.company.brms.helpers.DomainUtils.getUF;
  import function br.com.company.brms.helpers.PremioFactory.novoPremioVisaoPercursoPadrao;
  import function br.com.company.brms.helpers.CalculoTarifaHelper.calculaTaxaBasica;
  
  global br.com.company.brms.services.PremioVisaoService premioService;
  
  
  rule "Rule Example"
  ruleflow-group "calculo"
  salience -1
  when
  $averbacao : Averbacao( indicadorAvaria == Constantes.STATUS_SIM )
  $taxa : TarifaPercursoVigencia( tipoTarifa == TipoTarifa.AVARIA)
  then
  PremioVisaoPercursoPadrao premio = novoPremioVisaoPercursoPadrao($taxa, $averbacao);
  premio.setValor( calculaTaxaBasica($taxa, $averbacao) );
  
  //insert ( premio );
  premioService.inserirPremioCalculado( premio );
  
  //System.out.println( $averbacao + " calculada com o premio: " + premio );
  end
  </code></pre>
  
  <p>Follows below the stacktrace:</p>
  
  <pre><code>java.lang.RuntimeException: Unexpected global [premioService]
  at org.drools.core.impl.StatefulKnowledgeSessionImpl.setGlobal(StatefulKnowledgeSessionImpl.java:1124)
  at org.drools.core.command.runtime.SetGlobalCommand.execute(SetGlobalCommand.java:65)
  at org.drools.core.impl.StatefulKnowledgeSessionImpl.execute(StatefulKnowledgeSessionImpl.java:665)
  at org.drools.core.impl.StatefulKnowledgeSessionImpl.execute(StatefulKnowledgeSessionImpl.java:648)
  at br.com.company.brms.services.impl.BilhetagemBpmnRunnerServiceImpl.processar(BilhetagemBpmnRunnerServiceImpl.java:87)
  at br.com.company.brms.services.impl.BilhetagemBpmnRunnerServiceImpl.processarRegrasMercado(BilhetagemBpmnRunnerServiceImpl.java:52)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
  at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
  at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
  at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
  at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
  at $Proxy68.processarRegrasMercado(Unknown Source)
  at br.com.company.brms.services.impl.BilhetagemProcessManagerServiceImpl.processar(BilhetagemProcessManagerServiceImpl.java:111)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
  at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
  at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
  at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
  at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
  at $Proxy69.processar(Unknown Source)
  at br.com.company.brms.spi.impl.BilhetagemServiceAsyncImpl.processarPorCliente(BilhetagemServiceAsyncImpl.java:88)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
  at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:95)
  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
  at java.lang.Thread.run(Thread.java:662)
  </code></pre>
  
  <p>Tks in advance</p>