2012-09-26 7 views
1

Je n'ai jamais rencontré ce problème auparavant. En effet, j'ai une application web qui traverse un fichier war. J'ai configuré Spring pour travailler avec et ça fonctionne parfaitement.Déploiement de Web App avec Spring MVC

Le problème est que j'essaie de configurer Activiti à travers Spring. Fondamentalement, il existe un ensemble de fichiers .bpmn20.xml dans le dossier WEB-INF/processes. L'équipe d'Activiti a mentionné qu'ils ne savaient pas comment configurer cela dans une application web. En tant qu'application stand-alone, je peux déployer automatiquement les fichiers .bpmn20.xml des ressources car le dossier des processus se trouve sur le chemin de classe. J'ai de la difficulté à configurer dans une structure d'application Web.

S'il vous plaît voir ci-dessous:

Je suis créé une application Spring MVC et créé une base de données Activiti en exécutant le DbSchemaCreate.main(). En effet, mes processus ne semblent pas se déployer sur le fichier de guerre. Lorsque Tomcat démarre, ProcessEngine est démarré via Spring et fonctionne. Je peux accéder au RuntimeService. Le code peut être vu ci-dessous:

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web- app_2_5.xsd" 
    version="2.5"> 

    <display-name>WebApp</display-name> 

    <context-param> 
     <!-- Specifies the list of Spring Configuration files in comma separated format.--> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/activiti.xml 
     </param-value> 
    </context-param> 

    <listener> 
     <!-- Loads your Configuration Files--> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>example</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>example</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list>  

activiti.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="databaseSchemaUpdate" value="true"/> 
    <property name="jobExecutorActivate" value="false"/> 
    <property name="transactionManager" ref="transactionManager"></property> 
    <!-- <propety name="beans"> 
     <map> 
      <entry key="printer" value-ref="printer"/> 
     </map> 
     </property>--> 
    <property name="deploymentResources" value="classpath*:/processes.*.bpmn20.xml"/> 
    </bean> 

    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> 
    <property name="processEngineConfiguration" ref="processEngineConfiguration"/> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/activiti_example"/> 
    <property name="username" value="root"/> 
    <property name="password" value="password"/> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
    </bean> 

    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/> 
    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/> 
    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/> 
    <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/> 
    <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/> 

Le déploiement automatique de resosource n'est pas déployé. J'ai aussi essayé par le code de déployer, mais il jette une exception:

repositoryService.createDeployment().addClasspathResource("ProcessExample.bpmn20.xml").deploy(); 
runtimeService.startProcessInstanceByKey("processExample", mapOfProcessVariables); 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.activiti.engine.ActivitiException: resource 'ProcessExample.bpmn20.xml' not found 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
root cause 

    org.activiti.engine.ActivitiException: resource 'ProcessExample.bpmn20.xml' not found 
    org.activiti.engine.impl.repository.DeploymentBuilderImpl.addClasspathResource (DeploymentBuilderImpl.java:59) 
    com.webchannel.web.EmailController.sendE(EController.java:46) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

Comment cette ressource est située dans la webapp?

J'ai essayé de le placer dans WEB-INF/processes/ProcessExample.bpmn20.xml.

J'ai aussi essayé:

<property name="deploymentResources" value="/WEB-INF/processes.*.bpmn20.xml"/> 

EDIT

Ce site peut aider, mais je suis coincé.

Is WEB-INF in the CLASSPATH?

Répondre

1

Peut-être essayer d'ajouter le dossier dans lequel le processus est défini (votre fichier bpmn20.xml) sur le chemin de construction . L'erreur vous indique que Activiti-Engine ne trouve pas votre fichier, c'est pourquoi vous devez lui indiquer où le trouver.

0

Essayez ceci:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
 
\t \t http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
 
     version="3.1"> 
 

 
\t <!-- for specifies the Web application display name --> 
 
\t <display-name>APMC</display-name> 
 
\t 
 
    <!-- For Authentication processing mechanisms --> 
 
    <filter> 
 
     <filter-name>springSecurityFilterChain</filter-name> 
 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
 
    </filter> 
 
    <filter-mapping> 
 
     <filter-name>springSecurityFilterChain</filter-name> 
 
     <url-pattern>/*</url-pattern> 
 
    </filter-mapping> 
 
    
 
    \t <!-- For mapping request resource and combine its results with the matching JSP --> 
 
\t <servlet> 
 
    <servlet-name>mvc-dispatcher</servlet-name> 
 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
 
    <init-param> 
 
     <param-name>contextConfigLocation</param-name> 
 
     <param-value>/WEB-INF/spring-security.xml 
 
     </param-value> 
 
    </init-param> 
 
    <load-on-startup>1</load-on-startup> 
 
    </servlet> 
 
    <servlet-mapping> 
 
    <servlet-name>mvc-dispatcher</servlet-name> 
 
    <url-pattern>/</url-pattern> 
 
    </servlet-mapping> 
 
    
 
<servlet> 
 
    \t <servlet-name>rest</servlet-name> 
 
    \t <servlet-class> 
 
    \t \t org.springframework.web.servlet.DispatcherServlet 
 
    \t </servlet-class> 
 
    \t <load-on-startup>2</load-on-startup> 
 
</servlet> 
 

 
<servlet-mapping> 
 
    \t <servlet-name>rest</servlet-name> 
 
    \t <url-pattern>/rest/*</url-pattern> 
 
</servlet-mapping> 
 
    
 
<!-- ContextLoaderListener provides access to the ServletContext --> 
 
<context-param> 
 
    <param-name>contextConfigLocation</param-name> 
 
    <param-value>/WEB-INF/spring-config.xml, 
 
     \t \t \t /WEB-INF/spring-security.xml 
 
    </param-value> 
 
</context-param> 
 
    <listener> 
 
\t <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
 
    </listener> 
 
    
 
</web-app>
fichier ci-dessus est web.xml

<?xml version="1.0" encoding="UTF-8"?> 
 
<beans xmlns="http://www.springframework.org/schema/beans" 
 
\t xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
\t xmlns:task="http://www.springframework.org/schema/task" 
 
\t xmlns:context="http://www.springframework.org/schema/context" 
 
\t xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" \t 
 
\t xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
 
\t \t \t \t \t  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
 
\t \t \t \t \t  http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd 
 
\t \t \t \t \t  http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd 
 
\t \t \t \t \t  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 
 
    
 
    \t <context:component-scan base-package="com.apmc.dao" /> 
 
    \t 
 
\t <context:component-scan base-package="com.apmc.services" /> 
 
\t <task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" /> 
 
    <task:executor id="taskExecutor" pool-size="1" /> 
 
    <task:scheduler id="taskScheduler" pool-size="1" /> 
 
    
 
\t <context:component-scan base-package="com.apmc.controller" /> 
 
\t <context:component-scan base-package="com.apmc.rest" /> 
 
    \t <context:property-placeholder location="classpath:database.properties" /> 
 
    \t <context:property-placeholder location="classpath:log4j.properties" /> 
 

 
\t <mvc:resources mapping="/resources/**" location="/resources/mytheme/" /> 
 
\t <mvc:annotation-driven /> 
 

 
\t <bean id="dataSource" 
 
\t \t class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
 
\t \t <property name="driverClassName" value="${database.driver}" /> 
 
\t \t <property name="url" value="${database.url}" /> 
 
\t \t <property name="username" value="${database.user}" /> 
 
\t \t <property name="password" value="${database.password}" /> 
 
\t </bean> 
 
\t 
 
\t <bean id="sessionFactory" 
 
\t \t class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
 
\t \t <property name="dataSource" ref="dataSource" /> 
 
\t \t <property name="annotatedClasses"> 
 
      <list> 
 
       <value>com.apmc.domain.Vehicle</value> 
 
      </list> 
 
     </property> 
 
     
 
\t \t <property name="hibernateProperties"> 
 
\t \t \t <props> 
 
\t \t \t \t <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
 
\t \t \t \t <prop key="hibernate.hbm2ddl.auto">update</prop> 
 
\t \t \t \t <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
 
\t \t \t \t <prop key="hibernate.format_sql">false</prop> 
 
\t \t \t \t <prop key="hibernate.use_sql_comments">false</prop> 
 
\t \t \t </props> 
 
\t \t </property> 
 
\t \t 
 
\t </bean> 
 
    
 
\t <bean id="txManager" 
 
\t \t class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
 
\t \t <property name="sessionFactory" ref="sessionFactory" /> 
 
\t </bean> 
 
\t 
 
\t <bean id="persistenceExceptionTranslationPostProcessor" 
 
\t \t class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 
 
    \t \t 
 
\t <bean 
 
\t \t class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
 
\t \t <property name="prefix"> 
 
\t \t \t <value>/WEB-INF/pages/</value> 
 
\t \t </property> 
 
\t \t <property name="suffix"> 
 
\t \t \t <value>.jsp</value> 
 
\t \t </property> 
 
\t </bean> 
 
\t 
 
\t <bean id="messageSource" 
 
\t \t class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
 

 
\t \t <property name="basename" value="/WEB-INF/messages" /> 
 

 
\t </bean> 
 
\t 
 
\t <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate"> 
 
\t \t <property name="sessionFactory" ref="sessionFactory" /> 
 
    </bean> 
 
    
 
</beans>

code ci-dessus est le printemps-config.xml

Ajoutez le fichier database.properties dans le dossier des ressources du dossier src. Donc, écrire du code dans database.properties

database.driver=com.mysql.jdbc.Driver 
 
database.url=jdbc:mysql://localhost:3306/apmc_db 
 
database.user=root 
 
database.password= 
 
hibernate.show_sql=true 

Questions connexes