1.查看下Department 有没有提供无参构造方法(是不是只写了有参构造)
2.Department 类中是否提供了对应属性的setter方法

解决方案 »

  1.   

    这里是异常信息:
    谁帮的看看错在哪里了
    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)
      

  2.   

    这里是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方法
      

  3.   

          页面的请求路径写的对吗? 比如/login.do  设个断点调试下.
      

  4.   

          页面的请求路径写的对吗? 比如/login.do  设个断点调试下.
      

  5.   

    我看异常里有一个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) 
      

  6.   

    问题解决了
    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要分解表单的每一项要简单。