这里是异常信息: 谁帮的看看错在哪里了 DEBUG (ServletDispatcherResult.java:113) - Forwarding to location /department/error.jsp DEBUG (InstantiatingNullHandler.java:72) - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@c5f20f], property=struts] DEBUG (DefaultActionProxy.java:65) - Creating an DefaultActionProxy for namespace /action and action name addDepartmentAction DEBUG (ParametersInterceptor.java:142) - Setting params department.departmentName => [ 你好 ] department.parentDepartmentId => [ ] DEBUG (XWorkConverter.java:392) - Property: departmentName DEBUG (XWorkConverter.java:393) - Class: entity.Department DEBUG (XWorkConverter.java:282) - field-level type converter for property [departmentName] = none found DEBUG (XWorkConverter.java:392) - Property: department.departmentName DEBUG (XWorkConverter.java:393) - Class: action.AddDepartmentAction DEBUG (XWorkConverter.java:306) - global-level type converter for property [departmentName] = none found DEBUG (XWorkConverter.java:324) - falling back to default type converter [com.opensymphony.xwork2.util.XWorkBasicConverter@229ed4] DEBUG (XWorkConverter.java:392) - Property: parentDepartmentId DEBUG (XWorkConverter.java:393) - Class: entity.Department DEBUG (XWorkConverter.java:282) - field-level type converter for property [parentDepartmentId] = none found DEBUG (XWorkConverter.java:392) - Property: department.parentDepartmentId DEBUG (XWorkConverter.java:393) - Class: action.AddDepartmentAction DEBUG (XWorkConverter.java:306) - global-level type converter for property [parentDepartmentId] = none found DEBUG (XWorkConverter.java:324) - falling back to default type converter [com.opensymphony.xwork2.util.XWorkBasicConverter@229ed4] DEBUG (ValidationInterceptor.java:134) - Validating /action/addDepartmentAction with method execute. DEBUG (DefaultActionInvocation.java:378) - Executing action method = null java.lang.NullPointerException at action.AddDepartmentAction.execute(AddDepartmentAction.java:25) 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:585) at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:399) at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:262) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:161) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507) at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421) 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:228) 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:216) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445) at java.lang.Thread.run(Thread.java:595)
这里是Department类: package entity;/** * Department entity. * * @author MyEclipse Persistence Tools */public class Department implements java.io.Serializable { // Fields private Integer departmentId; private String departmentName; private Integer parentDepartmentId; // Constructors /** default constructor */ public Department() { } /** minimal constructor */ public Department(String departmentName) { this.departmentName = departmentName; } /** full constructor */ public Department(String departmentName, Integer parentDepartmentId) { this.departmentName = departmentName; this.parentDepartmentId = parentDepartmentId; } // Property accessors public Integer getDepartmentId() { return this.departmentId; } public void setDepartmentId(Integer departmentId) { this.departmentId = departmentId; } public String getDepartmentName() { return this.departmentName; } public void setDepartmentName(String departmentName) { this.departmentName = departmentName; } public Integer getParentDepartmentId() { return this.parentDepartmentId; } public void setParentDepartmentId(Integer parentDepartmentId) { this.parentDepartmentId = parentDepartmentId; }}这两项都满足啊: 1.查看下Department 有没有提供无参构造方法(是不是只写了有参构造) 2.Department 类中是否提供了对应属性的setter方法
页面的请求路径写的对吗? 比如/login.do 设个断点调试下.
页面的请求路径写的对吗? 比如/login.do 设个断点调试下.
我看异常里有一个field-level type converter for property [departmentName] = none found 大概意思是字段类型的装换器没有找到但是我看了别人的ssh2的例子,写的和我的没有区别 我再贴一次代码:1.表单部分 <s:form action="/action/addDepartmentAction.action" name="operationForm"> <s:textfield name="department.departmentName" label="部门名称" value=""></s:textfield> <s:textfield name="department.parentDepartmentId" label="上级部门" value=""></s:textfield> <s:submit value="登录"></s:submit> </s:form>2.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" 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_4.xsd"> <context-param> <param-name>contextConfigLocation </param-name> <param-value>/WEB-INF/applicationContext.xml </param-value> </context-param> <filter> <filter-name>struts2 </filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <!-- FilterDispatcher-strtus2--> <filter-mapping> <filter-name>struts2 </filter-name> <url-pattern>/* </url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app> 3.struts.xml <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="action" extends="struts-default" namespace="/action"> <action name="addDepartmentAction" class="action.AddDepartmentAction"> <result name="success">/department/succeed.jsp </result> <result name="error">/department/error.jsp </result> </action> </package> </struts> 4.这里是Department类: package entity; /** * Department entity. * * @author MyEclipse Persistence Tools */ public class Department implements java.io.Serializable { // Fields private Integer departmentId; private String departmentName; private Integer parentDepartmentId; // Constructors /** default constructor */ public Department() { } /** minimal constructor */ public Department(String departmentName) { this.departmentName = departmentName; } /** full constructor */ public Department(String departmentName, Integer parentDepartmentId) { this.departmentName = departmentName; this.parentDepartmentId = parentDepartmentId; } // Property accessors public Integer getDepartmentId() { return this.departmentId; } public void setDepartmentId(Integer departmentId) { this.departmentId = departmentId; } public String getDepartmentName() { return this.departmentName; } public void setDepartmentName(String departmentName) { this.departmentName = departmentName; } public Integer getParentDepartmentId() { return this.parentDepartmentId; } public void setParentDepartmentId(Integer parentDepartmentId) { this.parentDepartmentId = parentDepartmentId; } } 5.action package action; import com.opensymphony.xwork2.Action; import entity.Department; import service.DepartmentService; public class AddDepartmentAction implements Action { private Department department=new Department(); private DepartmentService departmentService; public void setDepartment(Department department){ this.department=department; } public Department getDepartment(){ return department; } public DepartmentService getDepartmentService(){ return departmentService; } public void setDepartmentService(DepartmentService departmentService){ this.departmentService=departmentService; } public String execute() throws Exception { //department=new Department(); try { departmentService.addDepartment(department); return "success"; } catch (Exception e) { e.printStackTrace(); return "error"; } } }6.这里是异常信息: 谁帮的看看错在哪里了 DEBUG (ServletDispatcherResult.java:113) - Forwarding to location /department/error.jsp DEBUG (InstantiatingNullHandler.java:72) - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@c5f20f], property=struts] DEBUG (DefaultActionProxy.java:65) - Creating an DefaultActionProxy for namespace /action and action name addDepartmentAction DEBUG (ParametersInterceptor.java:142) - Setting params department.departmentName => [ 你好 ] department.parentDepartmentId => [ ] DEBUG (XWorkConverter.java:392) - Property: departmentName DEBUG (XWorkConverter.java:393) - Class: entity.Department DEBUG (XWorkConverter.java:282) - field-level type converter for property [departmentName] = none found DEBUG (XWorkConverter.java:392) - Property: department.departmentName DEBUG (XWorkConverter.java:393) - Class: action.AddDepartmentAction DEBUG (XWorkConverter.java:306) - global-level type converter for property [departmentName] = none found DEBUG (XWorkConverter.java:324) - falling back to default type converter [com.opensymphony.xwork2.util.XWorkBasicConverter@229ed4] DEBUG (XWorkConverter.java:392) - Property: parentDepartmentId DEBUG (XWorkConverter.java:393) - Class: entity.Department DEBUG (XWorkConverter.java:282) - field-level type converter for property [parentDepartmentId] = none found DEBUG (XWorkConverter.java:392) - Property: department.parentDepartmentId DEBUG (XWorkConverter.java:393) - Class: action.AddDepartmentAction DEBUG (XWorkConverter.java:306) - global-level type converter for property [parentDepartmentId] = none found DEBUG (XWorkConverter.java:324) - falling back to default type converter [com.opensymphony.xwork2.util.XWorkBasicConverter@229ed4] DEBUG (ValidationInterceptor.java:134) - Validating /action/addDepartmentAction with method execute. DEBUG (DefaultActionInvocation.java:378) - Executing action method = null java.lang.NullPointerException at action.AddDepartmentAction.execute(AddDepartmentAction.java:25) 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:585)
谁帮的看看错在哪里了
DEBUG (ServletDispatcherResult.java:113) - Forwarding to location /department/error.jsp
DEBUG (InstantiatingNullHandler.java:72) - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@c5f20f], property=struts]
DEBUG (DefaultActionProxy.java:65) - Creating an DefaultActionProxy for namespace /action and action name addDepartmentAction
DEBUG (ParametersInterceptor.java:142) - Setting params department.departmentName => [ 你好 ] department.parentDepartmentId => [ ]
DEBUG (XWorkConverter.java:392) - Property: departmentName
DEBUG (XWorkConverter.java:393) - Class: entity.Department
DEBUG (XWorkConverter.java:282) - field-level type converter for property [departmentName] = none found
DEBUG (XWorkConverter.java:392) - Property: department.departmentName
DEBUG (XWorkConverter.java:393) - Class: action.AddDepartmentAction
DEBUG (XWorkConverter.java:306) - global-level type converter for property [departmentName] = none found
DEBUG (XWorkConverter.java:324) - falling back to default type converter [com.opensymphony.xwork2.util.XWorkBasicConverter@229ed4]
DEBUG (XWorkConverter.java:392) - Property: parentDepartmentId
DEBUG (XWorkConverter.java:393) - Class: entity.Department
DEBUG (XWorkConverter.java:282) - field-level type converter for property [parentDepartmentId] = none found
DEBUG (XWorkConverter.java:392) - Property: department.parentDepartmentId
DEBUG (XWorkConverter.java:393) - Class: action.AddDepartmentAction
DEBUG (XWorkConverter.java:306) - global-level type converter for property [parentDepartmentId] = none found
DEBUG (XWorkConverter.java:324) - falling back to default type converter [com.opensymphony.xwork2.util.XWorkBasicConverter@229ed4]
DEBUG (ValidationInterceptor.java:134) - Validating /action/addDepartmentAction with method execute.
DEBUG (DefaultActionInvocation.java:378) - Executing action method = null
java.lang.NullPointerException
at action.AddDepartmentAction.execute(AddDepartmentAction.java:25)
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:585)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:399)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:262)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:161)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)
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:228)
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:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:595)
package entity;/**
* Department entity.
*
* @author MyEclipse Persistence Tools
*/public class Department implements java.io.Serializable { // Fields private Integer departmentId;
private String departmentName;
private Integer parentDepartmentId; // Constructors /** default constructor */
public Department() {
} /** minimal constructor */
public Department(String departmentName) {
this.departmentName = departmentName;
} /** full constructor */
public Department(String departmentName, Integer parentDepartmentId) {
this.departmentName = departmentName;
this.parentDepartmentId = parentDepartmentId;
} // Property accessors public Integer getDepartmentId() {
return this.departmentId;
} public void setDepartmentId(Integer departmentId) {
this.departmentId = departmentId;
} public String getDepartmentName() {
return this.departmentName;
} public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
} public Integer getParentDepartmentId() {
return this.parentDepartmentId;
} public void setParentDepartmentId(Integer parentDepartmentId) {
this.parentDepartmentId = parentDepartmentId;
}}这两项都满足啊:
1.查看下Department 有没有提供无参构造方法(是不是只写了有参构造)
2.Department 类中是否提供了对应属性的setter方法
我再贴一次代码:1.表单部分
<s:form action="/action/addDepartmentAction.action" name="operationForm">
<s:textfield name="department.departmentName" label="部门名称" value=""></s:textfield>
<s:textfield name="department.parentDepartmentId" label="上级部门" value=""></s:textfield>
<s:submit value="登录"></s:submit>
</s:form>2.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
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_4.xsd">
<context-param>
<param-name>contextConfigLocation </param-name>
<param-value>/WEB-INF/applicationContext.xml </param-value>
</context-param>
<filter>
<filter-name>struts2 </filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher </filter-class>
</filter>
<!-- FilterDispatcher-strtus2-->
<filter-mapping>
<filter-name>struts2 </filter-name>
<url-pattern>/* </url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
</web-app> 3.struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="action" extends="struts-default" namespace="/action">
<action name="addDepartmentAction" class="action.AddDepartmentAction">
<result name="success">/department/succeed.jsp </result>
<result name="error">/department/error.jsp </result>
</action>
</package>
</struts> 4.这里是Department类:
package entity; /**
* Department entity.
*
* @author MyEclipse Persistence Tools
*/ public class Department implements java.io.Serializable { // Fields private Integer departmentId;
private String departmentName;
private Integer parentDepartmentId; // Constructors /** default constructor */
public Department() {
} /** minimal constructor */
public Department(String departmentName) {
this.departmentName = departmentName;
} /** full constructor */
public Department(String departmentName, Integer parentDepartmentId) {
this.departmentName = departmentName;
this.parentDepartmentId = parentDepartmentId;
} // Property accessors public Integer getDepartmentId() {
return this.departmentId;
} public void setDepartmentId(Integer departmentId) {
this.departmentId = departmentId;
} public String getDepartmentName() {
return this.departmentName;
} public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
} public Integer getParentDepartmentId() {
return this.parentDepartmentId;
} public void setParentDepartmentId(Integer parentDepartmentId) {
this.parentDepartmentId = parentDepartmentId;
} } 5.action
package action;
import com.opensymphony.xwork2.Action;
import entity.Department;
import service.DepartmentService;
public class AddDepartmentAction implements Action
{
private Department department=new Department();
private DepartmentService departmentService;
public void setDepartment(Department department){
this.department=department;
}
public Department getDepartment(){
return department;
}
public DepartmentService getDepartmentService(){
return departmentService;
}
public void setDepartmentService(DepartmentService departmentService){
this.departmentService=departmentService;
}
public String execute() throws Exception
{
//department=new Department();
try {
departmentService.addDepartment(department);
return "success";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
}6.这里是异常信息:
谁帮的看看错在哪里了
DEBUG (ServletDispatcherResult.java:113) - Forwarding to location /department/error.jsp
DEBUG (InstantiatingNullHandler.java:72) - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@c5f20f], property=struts]
DEBUG (DefaultActionProxy.java:65) - Creating an DefaultActionProxy for namespace /action and action name addDepartmentAction
DEBUG (ParametersInterceptor.java:142) - Setting params department.departmentName => [ 你好 ] department.parentDepartmentId => [ ]
DEBUG (XWorkConverter.java:392) - Property: departmentName
DEBUG (XWorkConverter.java:393) - Class: entity.Department
DEBUG (XWorkConverter.java:282) - field-level type converter for property [departmentName] = none found
DEBUG (XWorkConverter.java:392) - Property: department.departmentName
DEBUG (XWorkConverter.java:393) - Class: action.AddDepartmentAction
DEBUG (XWorkConverter.java:306) - global-level type converter for property [departmentName] = none found
DEBUG (XWorkConverter.java:324) - falling back to default type converter [com.opensymphony.xwork2.util.XWorkBasicConverter@229ed4]
DEBUG (XWorkConverter.java:392) - Property: parentDepartmentId
DEBUG (XWorkConverter.java:393) - Class: entity.Department
DEBUG (XWorkConverter.java:282) - field-level type converter for property [parentDepartmentId] = none found
DEBUG (XWorkConverter.java:392) - Property: department.parentDepartmentId
DEBUG (XWorkConverter.java:393) - Class: action.AddDepartmentAction
DEBUG (XWorkConverter.java:306) - global-level type converter for property [parentDepartmentId] = none found
DEBUG (XWorkConverter.java:324) - falling back to default type converter [com.opensymphony.xwork2.util.XWorkBasicConverter@229ed4]
DEBUG (ValidationInterceptor.java:134) - Validating /action/addDepartmentAction with method execute.
DEBUG (DefaultActionInvocation.java:378) - Executing action method = null
java.lang.NullPointerException
at action.AddDepartmentAction.execute(AddDepartmentAction.java:25)
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:585)
1.不一定要struts-default.xml也可以2.关于struts
<struts>
<package name="action" extends="struts-default" namespace="/action">
<action name="addDepartmentAction" class="action.AddDepartmentAction">
<result name="success">/department/succeed.jsp </result>
<result name="error">/department/error.jsp </result>
</action>
</package>
</struts>
class不能是类的物理位置,而应该是applictionContext.xml里action对应的id3.还需要struts2-spring-plugin2.0.6包4.表单的提交保存也可以用“模型驱动”来解决,这样表单内的文本框可以从“对象名.属性名”简化为“属性名”,我还没有尝试,但效果都是一样的,都比struts1要分解表单的每一项要简单。