我再用jbpm开发工作流的时候需要将数据加入到自定义的表里。表字段只有id不为空,其他均可。
但是表单页面如果全部填写完成之后就不会进断点了,如果不填写完成就会报空指针错误,不知道为什么,我用的是SSH ,其中struts2。
下面是我的代码。运行到像数据库插入数据的那一步就会报错。请大家指点一二。谢谢。
public class OfficeBuyAction extends ActionSupport {
private ProcessEngine processEngine;
private RepositoryService repositoryService;
private TaskService taskService;
private ExecutionService executionService;
private ProcessDefinition processDefinition;
private ProcessInstance processInstance;
private officeBuyService AssetServiceImpl;
private AssetsAppBuy asset;
private Employee employee;
/**
* @category 固定资产购买申请表(流程定义)
* @date 2012/03/16 10:43
* @author hjk
* @return ""
*/
public String start() {
asset.setEmployee(employee.getEmpNo());
asset.setAssetsId("11111111");
try {
AssetServiceImpl.insert(asset); -------在这里就会报错了
} catch (Exception e) {
e.printStackTrace();
}
return "buy"; }
但是表单页面如果全部填写完成之后就不会进断点了,如果不填写完成就会报空指针错误,不知道为什么,我用的是SSH ,其中struts2。
下面是我的代码。运行到像数据库插入数据的那一步就会报错。请大家指点一二。谢谢。
public class OfficeBuyAction extends ActionSupport {
private ProcessEngine processEngine;
private RepositoryService repositoryService;
private TaskService taskService;
private ExecutionService executionService;
private ProcessDefinition processDefinition;
private ProcessInstance processInstance;
private officeBuyService AssetServiceImpl;
private AssetsAppBuy asset;
private Employee employee;
/**
* @category 固定资产购买申请表(流程定义)
* @date 2012/03/16 10:43
* @author hjk
* @return ""
*/
public String start() {
asset.setEmployee(employee.getEmpNo());
asset.setAssetsId("11111111");
try {
AssetServiceImpl.insert(asset); -------在这里就会报错了
} catch (Exception e) {
e.printStackTrace();
}
return "buy"; }
解决方案 »
- 项目中的事务处理,急急急!!!
- jsp页面中如何设置session权限控制
- ssh程序在tomcat5.0中跑的很好但是tomcat6.0中跑步起来
- TOMCAT运行一个jsp+access做的论坛
- 一个常见的小问题
- 关于Windows后台服务,高分相送,急!!!!
- 如何在前台对验证码进行验证?
- 一个关于重定向的问题?
- 关于RESIN死机的情况
- openfire+smack实现聊天室功能MultiUserChat.isServiceEnabled问题
- sessionFactory返回值为什么是NullPointerException?
- 使用Spring框架时,如何在TOMCAT启动的时候把数据库里的数据读出来了
你是否使用了spring的ioc?你的这段代码是否全?
如果用的是spring的ioc那么很明显你没有setAssetServiceImpl的方法。无法完成注入
package com.topwalk.oa.person.asset.action;import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;import com.opensymphony.xwork2.ActionSupport;
import com.topwalk.oa.bo.Employee;
import com.topwalk.oa.person.asset.bo.AssetsAppBuy;
import com.topwalk.oa.person.asset.service.officeBuyService;@SuppressWarnings("serial")
public class OfficeBuyAction extends ActionSupport {
private ProcessEngine processEngine;
private RepositoryService repositoryService;
private TaskService taskService;
private ExecutionService executionService;
private ProcessDefinition processDefinition;
private ProcessInstance processInstance;
private officeBuyService AssetServiceImpl;
private AssetsAppBuy asset;
private Employee employee;
/**
* @category 固定资产购买申请表(启动流程)
* @date 2012/03/16 10:42
* @author hjk
* @return "buy"
*/
public String buy() {
processEngine = Configuration.getProcessEngine();
repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment().addResourceFromClasspath("/com/topwalk/oa/resource/asset/OfficeBuy.jpdl.xml").deploy();
return "buy"; } /**
* @category 固定资产购买申请表(流程定义)
* @date 2012/03/16 10:43
* @author hjk
* @return ""
*/
public String start() { asset.setEmployee(employee.getEmpNo());
asset.setAssetsId("11111111");
try {
AssetServiceImpl.insert(asset);
} catch (Exception e) {
e.printStackTrace();
}
return "buy"; }
public String service() {
processEngine = Configuration.getProcessEngine();
repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment().addResourceFromClasspath(
"/com/topwalk/oa/resource/asset/OfficeService.jpdl.xml")
.deploy();
return "service"; } public String borrow() {
processEngine = Configuration.getProcessEngine();
repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment().addResourceFromClasspath(
"/com/topwalk/oa/resource/asset/OfficeBuy.jpdl.xml").deploy();
return "borrow"; }
public ProcessInstance getProcessInstance() {
return processInstance;
} public void setProcessInstance(ProcessInstance processInstance) {
this.processInstance = processInstance;
} public ProcessDefinition getProcessDefinition() {
return processDefinition;
} public void setProcessDefinition(ProcessDefinition processDefinition) {
this.processDefinition = processDefinition;
}
public Employee getEmployee() {
return employee;
} public void setEmployee(Employee employee) {
this.employee = employee;
} public ExecutionService getExecutionService() {
return executionService;
} public void setExecutionService(ExecutionService executionService) {
this.executionService = executionService;
} public TaskService getTaskService() {
return taskService;
} public void setTaskService(TaskService taskService) {
this.taskService = taskService;
}
public AssetsAppBuy getAsset() {
return asset;
} public void setAsset(AssetsAppBuy asset) {
this.asset = asset;
} public void setRepositoryService(RepositoryService repositoryService) {
this.repositoryService = repositoryService;
}
public ProcessEngine getProcessEngine() {
return processEngine;
} public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
} public RepositoryService getRepositoryService() {
return repositoryService;
} public officeBuyService getAssetServiceImpl() {
return AssetServiceImpl;
} public void setAssetServiceImpl(officeBuyService assetServiceImpl) {
AssetServiceImpl = assetServiceImpl;
}
}
如下是jsp的页面代码:我就概括的将给实体bean赋值的几个文本框注视为红色吧。后台是可以获取到值的。
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.text.SimpleDateFormat,java.util.Date" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>固定资产申请购买表</title>
<link rel="stylesheet" href="../css/main.css" type="text/css"></link>
<link rel="stylesheet" href="../css/skin.css" type="text/css" />
</head>
<style type="text/css">
<!--
body {
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
background-color: #F8F9FA;
}
-->
</style><%
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date currentTime_1 = new Date();
%>
<body bgcolor="#ffffff">
<form action="asset!start.action" method="post" name="BuyForm">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="17" height="29" valign="top"
background="../images/mail_leftbg.gif">
<img src="../images/left-top-right.gif" width="17" height="29" />
</td>
<td width="935" height="29" valign="top"
background="../images/content-bg.gif">
<table width="100%" height="31" border="0" cellpadding="0" cellspacing="0" class="left_topbg" id="table2">
<tr>
<td height="31">
<div class="titlebt">
资产申请购买表
</div>
</td>
</tr>
</table>
</td>
<td width="16" valign="top" background="../images/mail_rightbg.gif">
<img src="../images/nav-right-bg.gif" width="16" height="29" />
</td>
</tr>
<tr>
<td height="71" valign="middle" background="../images/mail_leftbg.gif">
</td>
<td valign="top" bgcolor="#F7F8F9">
<table width="100%" height="138" border="0" cellpadding="0"
cellspacing="0">
<tr>
<td>
<table width="100%" height="31" border="0" cellpadding="0"
cellspacing="0" class="nowtable">
<tr>
<td class="left_bt2">
表单参数设置
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table width="100%" border="0" cellspacing="1" cellpadding="1">
<tr>
<td width="10%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
设备名称:
</td>
<td width="16%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
<input type="text" name="asset.assetsName" id="asset.assetsName" style="width: 160px" />
<font color="red">*</font>
</td>
<td width="9%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
购置数量:
</td>
<td width="16%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
<input type="text" name="asset.assetsNumber" id="asset.assetsNumber" style="width: 160px" />
<font color="red">*</font>
</td>
<td width="10%" id="CALLNATURE_GROUPDESC_TEXT" height="30"
align="right" class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
规格配置:
</td>
<td width="16%" height="30" align="left" class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
<input type="text" name="asset.assetsSpec" id="asset.assetsSpec" style="width: 160px" />
<font color="red">*</font>
</td>
<td width="20%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
</td>
</tr>
<tr>
<td width="10%" height="30" align="right"
class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
品牌型号:
</td>
<td width="16%" height="30" align="right"
class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
<input type="text" name="asset.assetsType" id="asset.assetsType" style="width: 160px" />
<font color="red">*</font>
</td>
<td width="9%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2"
bgcolor="#f2f2f2">
申 请 人:
</td>
<td width="16%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
<input type="text" name="employee.empNo" id="employee.empNo" style="width: 160px" />
<font color="red">*</font>
</td>
<td width="10%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
申请部门:
</td>
<td width="16%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="left" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
<input type="text" name="asset.assetsUserDep" id="asset.assetsUserDep" style="width: 160px" />
<font color="red">*</font>
</td>
<td width="20%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="left" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
</td>
</tr>
<tr>
<td width="10%" height="30"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
申请日期:
</td>
<td width="16%" height="30"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
<input type="text" name="asset.assetsAppDate" id="asset.assetsAppDate" style="width: 160px" value="<%=formatter.format(currentTime_1) %>" disabled="disabled"/>
<font color="red">*</font>
</td>
<tr>
<td width="10%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
用途说明:
</td>
<td colspan="5" width="70%" height="30"
align="left" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
<textarea rows="2" cols="5" name="asset.assetsUseFor" id="asset.assetsUseFor" style="width: 720px"></textarea>
</td>
<td width="20%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
</td>
</tr>
<tr>
<td width="10%" height="30"
align="left" class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
预估价格/供货情况:
</td>
<td colspan="5" width="70%" height="30" align="left"
class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
<textarea rows="2" cols="5" name="asset.assetsPrice" id="asset.assetsPrice" style="width: 720px"></textarea>
</td>
<td width="20%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
</td>
</tr>
<tr>
<td width="100%" colspan="6" height="30"
align="center" class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
<input type="submit" name="save_button" value="确定">
<input type="button"name="save_button" value="取消">
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
<td background="../images/mail_rightbg.gif"> </td>
</tr>
<tr>
<td valign="middle" background="../images/mail_leftbg.gif">
<img src="../images/buttom_left2.gif" width="17" height="17" />
</td>
<td height="17" valign="top" background="../images/buttom_bgs.gif">
<img src="../images/buttom_bgs.gif" width="17" height="17" />
</td>
<td background="../images/mail_rightbg.gif">
<img src="../images/buttom_right2.gif" width="16" height="17" />
</td>
</tr>
</table>
<div style="color:red">
<s:fielderror />
</div>
</form>
</body></html>
java.lang.NullPointerException
at com.topwalk.oa.person.asset.action.OfficeBuyAction.start(OfficeBuyAction.java:89)
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 com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)而且每次启动tomcat 的时候都会抱update progress 的错误。
get set 方法都已经有了哦。
<bean id="AssetServiceImpl" class="com.topwalk.oa.person.asset.service.officeBuyServiceImpl"></bean>还有,大小写有什么问题吗?
你Spring配置文件里面。有这样一句话得存在吗?
default-autowire="byName"
你start方法有好几句话,能确定 89行是哪行么?
public String start() {
asset.setEmployee(employee.getEmpNo());
asset.setAssetsId("11111111");
try {
AssetServiceImpl.insert(asset); -------在这里就会报错了
} catch (Exception e) {
e.printStackTrace();
}
return "buy";因为从你的错误堆栈信息中看,没有看到root cause,也就是说只能是第89行的问题,所以希望能再确认下89行是具体哪行?如果确定就是你标注的这行,那么就只能是 AssetServiceImpl 为空。也就是如果你改为:
try {
System.out.println(AssetServiceImpl); // 这里必然是null
AssetServiceImpl.insert(asset); -------在这里就会报错了
} catch (Exception e) {
e.printStackTrace();
}
那么接下来就是检查你是靠哪行配置去设置AssetServiceImpl值的。
private officeBuyService assetServiceImpl;
public officeBuyService getAssetServiceImpl() {
return assetServiceImpl;
} public void setAssetServiceImpl(officeBuyService assetServiceImpl) {
assetServiceImpl = assetServiceImpl;
}<bean id="assetServiceImpl" class="com.topwalk.oa.person.asset.service.officeBuyServiceImpl"></bean>这个就是app....xml的文件。再就没有地方用到这个类了啊。
原因如下:
@Autowired
private officeBuyService assetServiceImpl;只因为没有这个@autowired ;我查了一下:
这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。
<bean id="userDao" class="..."/>
<bean id="userService" class="...">
<property name="userDao">
<ref bean="userDao"/>
</property>
</bean>
这样你在userService里面要做一个userDao的setter/getter方法。
但如果你用了@Autowired的话,你只需要在UserService的实现类中声明即可。
@Autowired
private IUserDao userdao;
over !
在此感谢大家。谢谢。