在部署 OSWorkflow 2.7.0 示例應用時,配置 MySQL 數據庫連接常遇到 web.xml 解析錯誤(java.lang.NullPointerException)。本文梳理完整配置流程,助你避開常見陷阱。
org.gjt.mm.mysql.Driver)server.xml 定義 JNDI 數據源<Context path="/osworkflow_example" docBase="osworkflow-2.7.0-example"
debug="99" reloadable="true" crossContext="true">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="OSWorkflow." suffix=".log" timestamp="true"/>
<Resource name="jdbc/DefaultDS" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/DefaultDS">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter><name>maxActive</name><value>100</value></parameter>
<parameter><name>maxIdle</name><value>30</value></parameter>
<parameter><name>maxWait</name><value>10000</value></parameter>
<parameter><name>username</name><value>root</value></parameter>
<parameter><name>password</name><value></value></parameter>
<parameter><name>driverClassName</name><value>org.gjt.mm.mysql.Driver</value></parameter>
<parameter><name>url</name><value>jdbc:mysql://localhost:3306/osworkflow?autoReconnect=true</value></parameter>
</ResourceParams>
</Context>
關鍵點:
autoReconnect=true 防止 MySQL 8 小時空閒斷開導致連接失效;log4j.jar 放入 WEB-INF/lib;MemoryUserDatabaseFactory 重複定義。osworkflow.xml 持久化配置<osworkflow>
<persistence class="com.opensymphony.workflow.spi.jdbc.MySQLWorkflowStore">
<property key="datasource" value="jdbc/DefaultDS"/>
<property key="entry.sequence" value="SELECT COALESCE(MAX(id),0)+1 FROM os_wfentry"/>
<property key="entry.table" value="OS_WFENTRY"/>
<property key="entry.id" value="ID"/>
<property key="entry.name" value="NAME"/>
<property key="entry.state" value="STATE"/>
<property key="step.sequence" value="SELECT COALESCE(MAX(id),0)+1 FROM os_currentstep"/>
<property key="step.sequence.increment" value="INSERT INTO OS_STEPIDS (ID) VALUES (NULL)"/>
<property key="step.sequence.retrieve" value="SELECT MAX(ID) FROM OS_STEPIDS"/>
<property key="history.table" value="OS_HISTORYSTEP"/>
</persistence>
</osworkflow>
修正說明:原文 step.sequence 複雜聯查易出錯,簡化為單表 MAX(id)+1;確保序列表 OS_STEPIDS 存在且 ID 為自增主鍵。
propertyset.xml 屬性集配置<propertysets>
<propertyset class="com.opensymphony.module.propertyset.database.JDBCPropertySet" name="jdbc">
<property key="datasource" value="jdbc/DefaultDS"/>
</propertyset>
</propertysets>
web.xml 資源引用聲明<resource-ref>
<description>OSWorkflow Example App</description>
<res-ref-name>jdbc/DefaultDS</res-ref-name>
<res-ref-type>javax.sql.DataSource</res-ref-type>
<res-auth>Container</res-auth>
</resource-ref>
jboss-j2ee.jar 複製至 tomcat_home/common/endorsed;mysql-connector-java-3.1.x.jar) 放入 tomcat_home/common/lib;web.xml XML 格式無誤(常見錯誤:標籤未閉合、特殊字符未轉義);CREATE DATABASE osworkflow CHARSET utf8; 並執行官方建表腳本。| 錯誤現象 | 可能原因 | 解決方案 |
|---|---|---|
| Parse error in web.xml / NullPointerException | XML 格式錯誤、標籤嵌套錯亂 | 用 XML 驗證工具檢查,注意 & 需寫為 & |
| Cannot create JDBC driver | 驅動類名錯誤或 Jar 包缺失 | 確認 driverClassName、Jar 包路徑 |
| Communications link failure | MySQL 未啟用、端口錯誤、防火牆攔截 | 測試 telnet localhost 3306,檢查 bind-address |
| Access denied for user 'root' | 密碼錯誤或無遠程權限 | GRANT ALL ON osworkflow.* TO 'root'@'%' IDENTIFIED BY 'pwd'; FLUSH PRIVILEGES; |