Announcement

Collapse
No announcement yet.

Rätselhafte Nullpointerexception in Vaadin

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Rätselhafte Nullpointerexception in Vaadin

    Ich bin nach wie vor an meinem Vaadin-Activitiprojekt dran, mit H2 gibt es keine Probleme mehr, aber nun habe ich eine rätselhafte Nullpointerexception in Vaadin, obgleich ich versucht habe, die ProcessEngine streng nach Kochbuch zu erzeugen:

    Code:
    package com.example.testservlet;
    
    import javax.servlet.annotation.WebServlet;
    
    import com.vaadin.annotations.Theme;
    import com.vaadin.annotations.VaadinServletConfiguration;
    import com.vaadin.server.VaadinRequest;
    import com.vaadin.server.VaadinServlet;
    import com.vaadin.ui.Button;
    import com.vaadin.ui.Button.ClickEvent;
    import com.vaadin.ui.Label;
    import com.vaadin.ui.Notification;
    import com.vaadin.ui.UI;
    import com.vaadin.ui.VerticalLayout;
    
    import org.activiti.engine.*;
    
    @SuppressWarnings("serial")
    @Theme("testservlet")
    public class TestservletUI extends UI {
    
    	@WebServlet(value = "/*", asyncSupported = true)
    	@VaadinServletConfiguration(productionMode = false, ui = TestservletUI.class)
    	public static class Servlet extends VaadinServlet {
    	}
    
    	@Override
    	protected void init(VaadinRequest request) {
    		final VerticalLayout layout = new VerticalLayout();
    		layout.setMargin(true);
    		setContent(layout);
    
    
    		
    		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    		
    		if(processEngine == null){
    		Notification.show("Here we go with a nil engine.");
    		}
    		
    		
    		Button button = new Button("Click Me");
    		button.addClickListener(new Button.ClickListener() {
    			public void buttonClick(ClickEvent event) {
    				layout.addComponent(new Label("Thank you for clicking"));
    			}
    		});
    		layout.addComponent(button);
    	}
    
    }

    Ich habe die Activiti-Jars in das WEG-INF/lib verzeichnis meines Tomcat Webservers gesetzt, die Activiti-Wars befinden sich im webapps Verzeichnis und die activiti.cfg.xml-Datei habe ich an verschiedene Stellen gesetzt, aber ich bekomme, da die Process-Engine offenbar immer null ist, immer meine Notification angezeigt (siehe Code):

    Ich habe die erwähnte activiti.cfg.xml mal n das WEB-INF/lib-VZ gesetzt, mal nach WEB-INF, dann in das Package, in dem sich auch meine Servletklasse TestservletUI befindet, aber ich bekomme immer und immer wieder eine Nullpointerexception, obwohl ich genau die activiti.cfg.xml des Activiti-Usermanuals genommen habe:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">
    
      <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
      
        <property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
        <property name="jdbcDriver" value="org.h2.Driver" />
        <property name="jdbcUsername" value="sa" />
        <property name="jdbcPassword" value="" />
        
        <property name="databaseSchemaUpdate" value="true" />
        
        <property name="jobExecutorActivate" value="false" />
        
        <property name="mailServerHost" value="mail.my-corp.com" /> 
        <property name="mailServerPort" value="5025" />    
      </bean>
    
    </beans>
    Um die Frage zu auf den Punkt zu bringen: Was mache ich falsch?

  • #2
    Was mache ich falsch?
    Zeige den Stacktrace

    http://www.activiti.org/userguide/
    Christian

    Comment


    • #3
      Was ich an dieser Stelle als Update noch sagen möchte: die jar mit der StandaloneEngineConfiguration-Klasse ist vorhanden, und zwar im WEB-INF/lib-Folder, also daran kann es nicht liegen.

      Schwerwiegend:
      java.lang.nullpointerexception
      at com.example.testservlet.testservletui.init(testser vletui.java:48)
      at com.vaadin.ui.ui.doinit(ui.java:639)
      at com.vaadin.server.communication.uiinithandler.getb rowserdetailsui(uiinithandler.java:222)
      at com.vaadin.server.communication.uiinithandler.sync hronizedhandlerequest(uiinithandler.java:74)
      at com.vaadin.server.synchronizedrequesthandler.handl erequest(synchronizedrequesthandler.java:41)
      at com.vaadin.server.vaadinservice.handlerequest(vaad inservice.java:1402)
      at com.vaadin.server.vaadinservlet.service(vaadinserv let.java:305)
      at javax.servlet.http.httpservlet.service(httpservlet .java:727)
      at org.apache.catalina.core.applicationfilterchain.in ternaldofilter(applicationfilterchain.java:303)
      at org.apache.catalina.core.applicationfilterchain.do filter(applicationfilterchain.java:208)
      at org.apache.tomcat.websocket.server.wsfilter.dofilt er(wsfilter.java:52)
      at org.apache.catalina.core.applicationfilterchain.in ternaldofilter(applicationfilterchain.java:241)
      at org.apache.catalina.core.applicationfilterchain.do filter(applicationfilterchain.java:208)
      at org.apache.catalina.core.standardwrappervalve.invo ke(standardwrappervalve.java:220)
      at org.apache.catalina.core.standardcontextvalve.invo ke(standardcontextvalve.java:122)
      at org.apache.catalina.authenticator.authenticatorbas e.invoke(authenticatorbase.java:501)
      at org.apache.catalina.core.standardhostvalve.invoke( standardhostvalve.java:171)
      at org.apache.catalina.valves.errorreportvalve.invoke (errorreportvalve.java:103)
      at org.apache.catalina.valves.accesslogvalve.invoke(a ccesslogvalve.java:950)
      at org.apache.catalina.core.standardenginevalve.invok e(standardenginevalve.java:116)
      at org.apache.catalina.connector.coyoteadapter.servic e(coyoteadapter.java:408)
      at org.apache.coyote.http11.abstracthttp11processor.p rocess(abstracthttp11processor.java:1070)
      at org.apache.coyote.abstractprotocol$abstractconnect ionhandler.process(abstractprotocol.java:611)
      at org.apache.tomcat.util.net.jioendpoint$socketproce ssor.run(jioendpoint.java:316)
      at java.util.concurrent.threadpoolexecutor.runworker( unknown source)
      at java.util.concurrent.threadpoolexecutor$worker.run (unknown source)
      at org.apache.tomcat.util.threads.taskthread$wrapping runnable.run(taskthread.java:61)
      at java.lang.thread.run(unknown source)

      nov 14, 2014 10:35:07 am org.apache.catalina.core.standardwrappervalve invoke
      schwerwiegend: Servlet.service() for servlet [com.example.testservlet.testservletui$servlet] in context with path [/testservlet] threw exception [com.vaadin.server.serviceexception: Java.lang.nullpointerexception] with root cause
      java.lang.nullpointerexception
      at com.example.testservlet.testservletui.init(testser vletui.java:48)
      at com.vaadin.ui.ui.doinit(ui.java:639)
      at com.vaadin.server.communication.uiinithandler.getb rowserdetailsui(uiinithandler.java:222)
      at com.vaadin.server.communication.uiinithandler.sync hronizedhandlerequest(uiinithandler.java:74)
      at com.vaadin.server.synchronizedrequesthandler.handl erequest(synchronizedrequesthandler.java:41)
      at com.vaadin.server.vaadinservice.handlerequest(vaad inservice.java:1402)
      at com.vaadin.server.vaadinservlet.service(vaadinserv let.java:305)
      at javax.servlet.http.httpservlet.service(httpservlet .java:727)
      at org.apache.catalina.core.applicationfilterchain.in ternaldofilter(applicationfilterchain.java:303)
      at org.apache.catalina.core.applicationfilterchain.do filter(applicationfilterchain.java:208)
      at org.apache.tomcat.websocket.server.wsfilter.dofilt er(wsfilter.java:52)
      at org.apache.catalina.core.applicationfilterchain.in ternaldofilter(applicationfilterchain.java:241)
      at org.apache.catalina.core.applicationfilterchain.do filter(applicationfilterchain.java:208)
      at org.apache.catalina.core.standardwrappervalve.invo ke(standardwrappervalve.java:220)
      at org.apache.catalina.core.standardcontextvalve.invo ke(standardcontextvalve.java:122)
      at org.apache.catalina.authenticator.authenticatorbas e.invoke(authenticatorbase.java:501)
      at org.apache.catalina.core.standardhostvalve.invoke( standardhostvalve.java:171)
      at org.apache.catalina.valves.errorreportvalve.invoke (errorreportvalve.java:103)
      at org.apache.catalina.valves.accesslogvalve.invoke(a ccesslogvalve.java:950)
      at org.apache.catalina.core.standardenginevalve.invok e(standardenginevalve.java:116)
      at org.apache.catalina.connector.coyoteadapter.servic e(coyoteadapter.java:408)
      at org.apache.coyote.http11.abstracthttp11processor.p rocess(abstracthttp11processor.java:1070)
      at org.apache.coyote.abstractprotocol$abstractconnect ionhandler.process(abstractprotocol.java:611)
      at org.apache.tomcat.util.net.jioendpoint$socketproce ssor.run(jioendpoint.java:316)
      at java.util.concurrent.threadpoolexecutor.runworker( unknown source)
      at java.util.concurrent.threadpoolexecutor$worker.run (unknown source)
      at org.apache.tomcat.util.threads.taskthread$wrapping runnable.run(taskthread.java:61)
      at java.lang.thread.run(unknown source)
      Zuletzt editiert von dfss; 14.11.2014, 12:18.

      Comment


      • #4
        at com.example.testservlet.testservletui.init(testser vletui.java:48)

        Also wird sie hier

        layout.addComponent(button);

        geworfen. Debugge das Programm, wer da null ist
        Christian

        Comment


        • #5
          Ich habe mich hineindebugged, und die ProcessEngine ist null. Dies;

          Code:
          ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
          erzeugt mir eine ProcessEngine, die null ist, und wenn ich an dieser mit dem . - Operator eine Methode aufrufen will, dann fliegt mir sinnigerweise der beannnte Stacktrace um die Ohren, es muss also genaun daran liegen. an dem nichtvorhandensein des h2-Treibers (in der activiti.cfg.xml) kann es auch nciht liegen, denn diese wird ja mitgeliefert also vorkonfigurierte h2, das war ja das Problem im letzten Thread, welchen ich vor diesme erstellte.

          Comment


          • #6
            Dann müsste das

            Notification.show("Here we go with a nil engine.");

            ausgeführt werden und Zeile 48 ist bei mir die obige.

            Ggf. ergänze

            if(processEngine == null){ System.out.println("Engine null); }
            Das müsste ja auf der Console erscheinen
            Christian

            Comment


            • #7
              http://forums.activiti.org/content/problem-events

              Hast du die activiti.cfg.xml ins WEB-INF/lib gepackt
              Christian

              Comment


              • #8
                Hast du die activiti.cfg.xml ins WEB-INF/lib gepackt
                ...ja, schon zu Anfang meiner Bemühungen, jetzt habe ich sie wieder dort reingepackt und nach wie vor bekomme ich den Stacktrace. Die Notification habe ich nun aus dem Programm rausgeschmissen, denn wozu hat man einen De-Bagger... Die processengine ist aber laut Debugger definitiv ein null-Objekt.

                Comment


                • #9
                  Habe dann keine Idee mehr
                  Christian

                  Comment


                  • #10
                    ...hm ja, also ich denke auch, da hilft nur noch ein Exorzist

                    Comment


                    • #11
                      Eigentlich kann die Zeile


                      ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();


                      nicht der Auslöser sein.
                      processEngine wird nicht weiter genutzt....
                      Christian

                      Comment


                      • #12
                        Zunächst muss ich mich entschuldigen - der Stacktrace bezog sich auf einen Code, welchen ich unterdessen modifiziert habe, also nicht auf den, den ich im Eingangspost gepostet habe. Nichtsdestotrotz liegt das Problem an der Processengine, denn:

                        Also auf diese Weise...

                        Code:
                        package com.example.testservlet;
                        
                        import java.util.HashMap;
                        import java.util.List;
                        import java.util.Map;
                        
                        import javax.servlet.annotation.WebServlet;
                        
                        import com.vaadin.annotations.Theme;
                        import com.vaadin.annotations.VaadinServletConfiguration;
                        import com.vaadin.server.VaadinRequest;
                        import com.vaadin.server.VaadinServlet;
                        import com.vaadin.ui.Button;
                        import com.vaadin.ui.Button.ClickEvent;
                        import com.vaadin.ui.Label;
                        import com.vaadin.ui.Notification;
                        import com.vaadin.ui.UI;
                        import com.vaadin.ui.VerticalLayout;
                        
                        import org.activiti.engine.*;
                        import org.activiti.engine.runtime.ProcessInstance;
                        import org.activiti.engine.task.Task;
                        import org.eclipse.jetty.util.log.Log;
                        
                        @SuppressWarnings("serial")
                        @Theme("testservlet")
                        public class TestservletUI extends UI {
                        
                        	@WebServlet(value = "/*", asyncSupported = true)
                        	@VaadinServletConfiguration(productionMode = false, ui = TestservletUI.class)
                        	public static class Servlet extends VaadinServlet {
                        	}
                        
                        	@Override
                        	protected void init(VaadinRequest request) {
                        		final VerticalLayout layout = new VerticalLayout();
                        		layout.setMargin(true);
                        		setContent(layout);
                        
                        
                        ///////////////////////////////////////////////////////////
                         
                        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
                        
                        		RepositoryService repositoryService = processEngine.getRepositoryService();
                        		repositoryService.createDeployment()
                        		  .addClasspathResource("com\\example\\testservlet\\VacationRequest.bpmn20.xml")
                        		  .deploy();
                        		      
                        //		Log.info("Number of process definitions: " + repositoryService.createProcessDefinitionQuery().count());
                        //		
                        //		Map<String, Object> variables = new HashMap<String, Object>();
                        //		variables.put("employeeName", "Kermit");
                        //		variables.put("numberOfDays", new Integer(4));
                        //		variables.put("vacationMotivation", "I'm really tired!");
                        //		      
                        //		RuntimeService runtimeService = processEngine.getRuntimeService();
                        //		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables);
                        		      
                        //		// Verify that we started a new process instance
                        //		Log.info("Number of process instances: " + runtimeService.createProcessInstanceQuery().count());           
                        //		
                        //		// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        //		// Fetch all tasks for the management group -> Und das soll die Grundlage dafür sein, dass ich die "Sache" 
                        //		// über den Postmanclienten "anpinge", um zu sehen, dass sich dies Tasks anzeihen lassen.
                        //		TaskService taskService = processEngine.getTaskService();
                        //		
                        //		List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
                        //		for (Task task : tasks) {
                        //		  Log.info("Task available: " + task.getName());
                        //		}        
                        //		
                        //		
                        //		Task task = tasks.get(0);
                        //	      
                        //		Map<String, Object> taskVariables = new HashMap<String, Object>();
                        //		taskVariables.put("vacationApproved", "false");
                        //		taskVariables.put("managerMotivation", "We have a tight deadline!");
                        //		taskService.complete(task.getId(), taskVariables);  // !!!!!!!!!! Den Anpingversuch mal mit, mal ohne comletion versuchen.
                        		     		
                        ///////////////////////////////////////////////////////////
                        
                        		
                        		
                        		Button button = new Button("Click Me");
                        		button.addClickListener(new Button.ClickListener() {
                        			public void buttonClick(ClickEvent event) {
                        				layout.addComponent(new Label("Thank you for clicking"));
                        			}
                        		});
                        		layout.addComponent(button);
                        	}
                        
                        }
                        ...bekomme ich eine Fehlrmeldung.


                        Auf diese Weise:

                        Code:
                        package com.example.testservlet;
                        
                        import java.util.HashMap;
                        import java.util.List;
                        import java.util.Map;
                        
                        import javax.servlet.annotation.WebServlet;
                        
                        import com.vaadin.annotations.Theme;
                        import com.vaadin.annotations.VaadinServletConfiguration;
                        import com.vaadin.server.VaadinRequest;
                        import com.vaadin.server.VaadinServlet;
                        import com.vaadin.ui.Button;
                        import com.vaadin.ui.Button.ClickEvent;
                        import com.vaadin.ui.Label;
                        import com.vaadin.ui.Notification;
                        import com.vaadin.ui.UI;
                        import com.vaadin.ui.VerticalLayout;
                        
                        import org.activiti.engine.*;
                        import org.activiti.engine.runtime.ProcessInstance;
                        import org.activiti.engine.task.Task;
                        import org.eclipse.jetty.util.log.Log;
                        
                        @SuppressWarnings("serial")
                        @Theme("testservlet")
                        public class TestservletUI extends UI {
                        
                        	@WebServlet(value = "/*", asyncSupported = true)
                        	@VaadinServletConfiguration(productionMode = false, ui = TestservletUI.class)
                        	public static class Servlet extends VaadinServlet {
                        	}
                        
                        	@Override
                        	protected void init(VaadinRequest request) {
                        		final VerticalLayout layout = new VerticalLayout();
                        		layout.setMargin(true);
                        		setContent(layout);
                        
                        
                        ///////////////////////////////////////////////////////////
                         
                        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
                        
                        //		RepositoryService repositoryService = processEngine.getRepositoryService();
                        //		repositoryService.createDeployment()
                        //		  .addClasspathResource("com\\example\\testservlet\\VacationRequest.bpmn20.xml")
                        //		  .deploy();
                        		      
                        //		Log.info("Number of process definitions: " + repositoryService.createProcessDefinitionQuery().count());
                        //		
                        //		Map<String, Object> variables = new HashMap<String, Object>();
                        //		variables.put("employeeName", "Kermit");
                        //		variables.put("numberOfDays", new Integer(4));
                        //		variables.put("vacationMotivation", "I'm really tired!");
                        //		      
                        //		RuntimeService runtimeService = processEngine.getRuntimeService();
                        //		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables);
                        		      
                        //		// Verify that we started a new process instance
                        //		Log.info("Number of process instances: " + runtimeService.createProcessInstanceQuery().count());           
                        //		
                        //		// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        //		// Fetch all tasks for the management group -> Und das soll die Grundlage dafür sein, dass ich die "Sache" 
                        //		// über den Postmanclienten "anpinge", um zu sehen, dass sich dies Tasks anzeihen lassen.
                        //		TaskService taskService = processEngine.getTaskService();
                        //		
                        //		List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
                        //		for (Task task : tasks) {
                        //		  Log.info("Task available: " + task.getName());
                        //		}        
                        //		
                        //		
                        //		Task task = tasks.get(0);
                        //	      
                        //		Map<String, Object> taskVariables = new HashMap<String, Object>();
                        //		taskVariables.put("vacationApproved", "false");
                        //		taskVariables.put("managerMotivation", "We have a tight deadline!");
                        //		taskService.complete(task.getId(), taskVariables);  // !!!!!!!!!! Den Anpingversuch mal mit, mal ohne comletion versuchen.
                        		     		
                        ///////////////////////////////////////////////////////////
                        
                        		
                        		
                        		Button button = new Button("Click Me");
                        		button.addClickListener(new Button.ClickListener() {
                        			public void buttonClick(ClickEvent event) {
                        				layout.addComponent(new Label("Thank you for clicking"));
                        			}
                        		});
                        		layout.addComponent(button);
                        	}
                        
                        }
                        ...bekomme ich keine Fehlermeldung, der einzige unterschied zwischen den beiden Codesnippets ist doch, dass ich bei dem einen an der processengine versuche, eine Methode aufzurufen, bei dem unteren unternehme ich eben diesen Versuch nicht, also kann es nur an dem Objekt vom Typ ProcessEngine liegen.

                        Also entschuldige bitte nochmals, dass ich das so irreführend postete. Mal eine Frage: ich habe ein Problem, was sehr ähnlich ist, ebenfalls stellt Avtiviti mich da vor ein Rätsel - darf ich einen neuen Thread öffnen oder bestehst Du darauf, dass erst dieser verfolgt wird?

                        Comment


                        • #13
                          Neues Thema, neuer Thread



                          repositoryService kann auch null sein
                          Christian

                          Comment


                          • #14
                            Klar, repositoryService kann auch null sein, oder besser gesagt: könnte, wenn das Problem mir nicht schon eher um die Ohren fliegen würde, nämlich exakt eine Zeile weiter oben, wo ich eben an der processEngine, die null ist, eine Methode aufzurufen versuche.
                            Zuletzt editiert von dfss; 14.11.2014, 15:31.

                            Comment


                            • #15
                              As stated in the Javadoc for ProcessEngines, this class is used by a ServletContextListener, which calls the ProcessEngines.init().
                              The init() will scan the classpath for activiti.properties an tries to build a ProcessEngine for each file found.

                              The getDefaultProcessEngine() only works of the ProcessEngines.init() has been called (by org.activiti.impl.servlet.listener.ProcessEnginesS ervletContextListener or by calling it yourself once) and if a process-engine with name 'default' is available.


                              http://forums.activiti.org/content/a...senginebuilder
                              Christian

                              Comment

                              Working...
                              X