SpringMvc java.lang.NullPointerException - 配置是否正确

时间:2012-09-28 16:33:17

标签: java web-services spring-mvc nullpointerexception javabeans

关于这个问题的许多回复我都很紧张,很多人都说我需要使用注释,但我不认为这是问题,也许我的配置有错误。它可能在我的豆线上。我在两点 1时遇到错误。当我从userName字段中跳出时 - 因为我正在执行此时的Web服务 2。当我点击提交按钮并发布数据时。

我正在尝试检查数据库,看看 userName 是否已经存在,所以我使用了 Web服务,所以当我跳出字段时它会检查数据库。当我将数据发布到服务器时,我也想做同样的验证,所以我再次调用相同的函数。

该函数返回布尔值。它是一个接受String userName 参数的类中的函数。也许我错误地连接了bean。如果我创建工厂Bean 并创建 applicationContext.xml 的新实例,它可以工作:

FactoryBean.java

package com.crimetrack.service;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public final class FactoryBean {

      private static ClassPathXmlApplicationContext context;

      private static ClassPathXmlApplicationContext getContext() {
            if (context == null) {
                context = new ClassPathXmlApplicationContext("applicationContext.xml");
            }
            return context;
        }

      public static OfficerRegistrationValidation getOfficerRegistrationValidation() {
            return (OfficerRegistrationValidation) getContext().getBean("officerRegistrationValidation");
        }

}

然后如果我使用

(FactoryBean.getOfficerRegistrationValidation().validateUserNameManager.DoesUserNameExist(officer.getUserName()) == true){
它在 OfficerRegistrationValidation.java 中有效但我无法在我的应用程序中使用它,因为它在 applicationContext.xml 中创建了每个bean的新实例,这会影响我的应用

Under是我的代码和两个错误日志1.当我选中userName字段和2.当我通过提交按钮发布表单时。我希望这能很好地展示我想要实现的目标:

office_registration.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head>


    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>

        <style>
            <%@ include file="../css/forms.css" %>

        </style>
        <script type="text/javascript">
            <%@ include file="../js/off_reg.js"%>


            $(document).ready(function(){

                $('#userName').blur(function(evt){


                    CheckAvailability();                    
                });
            });         

            function CheckAvailability(){

                $.ajax( {
                      type:'GET', 
                      url:'validateUserName.htm',
                      data:{userName:$('#userName').val()},
                      dataType: 'json',
                      success:function(data) {

                        if (data == true){

                            alert("User Name Already Exists");

                            $("#userNameErr").text("User Name Already Exist");

                        }else if ($("#userName").val() == ""){

                            $("#userNameErr").text(" ");

                        }else if(data == false){

                            $("#userNameErr").text("User Name Valid");

                        }


                         }


                    });

        }   


        </script>



    <title>Officer Registration</title>

    </head>

    <body>
    <form:form method="post" modelAttribute="officers" action="officer_registration.htm">
        <ol>

            <li><label>User Name</label>
                <form:input path="userName"/><form:errors path="userName" id="errors"/><label id="userNameErr"></label></li>
            <li><label>Password</label>
                <form:password path="password"/><form:errors path="password" id="errors"/></li>
            <li><label>Re-Enter Password</label>
                <form:password path="password2"/><form:errors path="password2" id="errors"/></li>
            <li><label>e-Mail Address</label>
                <form:input path="emailAdd"/><form:errors path="emailAdd" id="errors"/></li>

            <br/>
            <li><input type="submit" name= "request" value="Register" />
            <input type="submit" name= "request" value="Update" /></li>         

        </ol>

    </form:form>





    </body>
</html>

OfficerRegistrationValidation.java

public class OfficerRegistrationValidation implements Validator{


    private final Logger logger = Logger.getLogger(getClass());


    ValidateUserNameManager validateUserNameManager;


    public boolean supports(Class<?> clazz) {

        return Officers.class.equals(clazz);
    }


    public void validate(Object target, Errors errors) {

        Officers officer = (Officers) target;

        if (officer.getUserName() == null){

            errors.rejectValue("userName", "userName.required");

        }else{

            String userName = officer.getUserName();                    

            logger.info("OfficerRegistrationValidation - UserName is not null so going to check if its valid for :" + userName);
            try {



                logger.info("OfficerRegistrationValidation - Just before try.....catch block...userName is :" + userName);  

                logger.info("OfficerRegistrationValidation - about to evaluate if (validateUserNameManager.DoesUserNameExist(officer.getUserName()) == true)" );


                //using a factory bean to instantiate the creation of the bean
                //in some cases you want to use the existing bean and not instantiate



                //if (FactoryBean.getOfficerRegistrationValidation().validateUserNameManager.DoesUserNameExist(officer.getUserName()) == true){
                if (validateUserNameManager.DoesUserNameExist(officer.getUserName())== true){
                    errors.rejectValue("userName", "userName.exist");
                }
            } catch (Exception e) {

                logger.info("OfficerRegistrationValidation - Error Occured When validating UserName");
                logger.error("Message", e);
                errors.rejectValue("userName", "userName.error");
            }

        }

        if(officer.getPassword()== null){
            errors.rejectValue("password", "password.required");
        }

        if(officer.getPassword2()== null){
            errors.rejectValue("password2", "password2.required");
        }


    }


    /**
     * @return the validateUserNameManager
     */
    public ValidateUserNameManager getValidateUserNameManager() {
        logger.info("Getting - ValidateUserNameManager");
        return validateUserNameManager;
    }


    /**
     * @param validateUserNameManager the validateUserNameManager to set
     */
    public void setValidateUserNameManager(
            ValidateUserNameManager validateUserNameManager) {

        logger.info("Setting - ValidateUserNameManager");
        this.validateUserNameManager = validateUserNameManager;
    }       

}

ValidateUserNameManager.java

public class ValidateUserNameManager implements ValidateUserNameIFace {

    public ValidateUserNameManager(){}

    private OfficersDAO officerDao;

    private final Logger logger = Logger.getLogger(getClass());


    public boolean DoesUserNameExist(String userName) throws Exception {

        logger.info("Inside ValidateUserNameManager");

        try{

            logger.info("ValidateUserNameManager - UserName is : " + userName);

            if(officerDao.OfficerExist(userName) == true){

                logger.info("ValidateUserNameManager - UserName :" + userName + " does exist");
                return true;

            }else{
                logger.info("ValidateUserNameManager - UserName :" + userName + " does NOT exist");
                return false;
            }


        }catch(Exception e){
            logger.error("Message", e);
            logger.info("ValidateUserNameManager - UserName :" + userName + " EXCEPTION OCCURED " + e.toString());
            return false;
        }       

    }

    /**
     * @return the officerDao
     */
    public OfficersDAO getOfficerDao() {
        logger.info("ValidateUserNameManager - getting officerDAO");
        return officerDao;
    }

    /**
     * @param officerdao the officerDao to set
     */
    public void setOfficerDao(OfficersDAO officerDao) {
        logger.info("ValidateUserNameManager - setting officerDAO");
        this.officerDao = officerDao;
    }



}

OfficerRegistrationController.java

@Controller
public class OfficerRegistrationController {

    private final Logger logger = Logger.getLogger(getClass());
    private DivisionManager divisionManager;
    private PositionManager positionManager;
    private GenderManager genderManager;
    private Officers officer = new Officers();


    private ValidateUserNameManager validateUserNameManager;

    Map<String, Object> myDivision = new HashMap<String, Object>();
    Map<String, Object> myPosition = new HashMap<String, Object>();
    Map<String, Object> myGender = new HashMap<String, Object>();


    @InitBinder("officers")
    protected void initBinder(WebDataBinder binder){


        //removes white spaces 
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));

        //formats date 
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        //By passing true this will convert empty strings to null
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
        dateFormat.setLenient(false);


        logger.info("Just before initBinder");
        binder.setValidator(new OfficerRegistrationValidation());


    }


     @RequestMapping(value="officer_registration.htm", method = RequestMethod.GET)
        public ModelAndView loadPage(HttpServletRequest request,
                HttpServletResponse response,@ModelAttribute Officers officer, BindingResult result, ModelMap m, Model model) throws Exception {     


         try{           


             logger.debug("In Http method for OfficerRegistrationController");


                myDivision.put("divisionList", this.divisionManager.getDivisions());


                myPosition.put("positionList", this.positionManager.getPositionList());


                myGender.put("genderList", this.genderManager.getGenderList());

                model.addAttribute("division", myDivision);
                model.addAttribute("position", myPosition);
                model.addAttribute("gender", myGender);

             return new ModelAndView("officer_registration");            


         }catch(Exception e){

            request.setAttribute("error",e.getMessage());
            return new ModelAndView("error_page");           
         }       
     }

     @RequestMapping(value="officer_registration.htm", method=RequestMethod.POST)
     public ModelAndView handleRequest(@Valid @ModelAttribute Officers officer, BindingResult result, ModelMap m, Model model)throws Exception{


         if(result.hasErrors()){

             model.addAttribute("division", myDivision);
             model.addAttribute("position", myPosition);
             model.addAttribute("gender", myGender);
             return new ModelAndView("officer_registration");

        }else{

            return null;
        }   

     }

     @RequestMapping(value="validateUserName.htm", method=RequestMethod.GET)


     public @ResponseBody String validateUserName(@RequestParam String userName)throws Exception{
         String results = "false";
         logger.info("Inside OfficerRegistrationController");
         try{

             logger.info("In try ..... catch for OfficerRegistrationController");
            if (validateUserNameManager.DoesUserNameExist(userName)== true){


                results = "true";
                return results;

             }   

         }catch(Exception e){

             logger.debug("Error in validateUserName Controller " + e.toString());
             return results;

         }

            return results;

     }



     public void setDivisionManager(DivisionManager divisionManager){

         this.divisionManager = divisionManager;
     }

     public void setPositionManager(PositionManager positionManager){

         this.positionManager = positionManager;

     }

     public void setGenderManager(GenderManager genderManager){

         this.genderManager = genderManager;
     }



    /**
     * @return the validateUserNameManager
     */
    public ValidateUserNameManager getValidateUserNameManager() {
        return validateUserNameManager;
    }

    /**
     * @param validateUserNameManager the validateUserNameManager to set
     */
    public void setValidateUserNameManager(
            ValidateUserNameManager validateUserNameManager) {
        this.validateUserNameManager = validateUserNameManager;
    }




    /**
     * @return the officer
     */
    public Officers getOfficer() {
        return officer;
    }



    /**
     * @param officer the officer to set
     */
    public void setOfficer(Officers officer) {
        this.officer = officer;
    }


}

crimetrack-servlet.xml中

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"..............


<!-- __________________________________________________________________________________________________ -->    

     <!-- Supports annotations and allows the use of @Controller, @Required, @RequestMapping -->
    <context:annotation-config/>    

    <context:component-scan base-package="com.crimetrack" />
<!-- __________________________________________________________________________________________________ -->    

    <!-- Forwards requests to the "/" resource to the "login" view -->  
    <mvc:view-controller path="/login" view-name="login"/>

    <!-- Forwards requests to the "/" resource to the "officer_registration" view -->  
    <mvc:view-controller path="/officer_registration" view-name="officer_registration"/>
<!-- __________________________________________________________________________________________________ -->    

    <!--  <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> --> 

    <!--  Is used to process method level annotations -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>    
<!-- __________________________________________________________________________________________________ -->    

    <!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>  --> 

     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basename" value="messages"/>
     </bean>
<!-- __________________________________________________________________________________________________ --> 

     <bean name="/hello.htm" class="com.crimetrack.web.CountryListController">
        <property name="countryManager" ref="countryManager"/>
     </bean>

    <bean name="/login.htm" class="com.crimetrack.web.AuthenticationController">
        <property name="authenticationManager" ref="authenticationManager"/>  
    </bean>

    <bean name="/officer_registration.htm" class="com.crimetrack.web.OfficerRegistrationController">
        <property name="divisionManager" ref="divisionManager" />
        <property name="positionManager" ref="positionManager" />
        <property name="genderManager" ref="genderManager"/>  
    </bean>

<!-- __________________________________________________________________________________________________ -->    

    <bean name="/validateUserName.htm" class="com.crimetrack.web.OfficerRegistrationController">

        <property name="validateUserNameManager" ref="validateUserNameManager"/>    

    </bean>    


<!-- __________________________________________________________________________________________________ -->    

      <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>        
      </bean>



</beans>

的applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"...............


<!-- __________________________________________________________________________________________________ -->              

    <bean id="countryManager" class="com.crimetrack.service.CountryManager">
        <property name="countryDao" ref="countryDao"/>
    </bean>
    <bean id="countryDao" class="com.crimetrack.jdbc.JdbcCountryDAO">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!-- __________________________________________________________________________________________________ -->

    <bean id="authenticationManager" class="com.crimetrack.service.AuthenticationManager">
        <property name="loginDao" ref="loginDao" /> 
    </bean>    
    <bean id="loginDao" class="com.crimetrack.jdbc.JdbcLoginDAO">
        <property name="dataSource" ref="dataSource" />
    </bean>
<!-- __________________________________________________________________________________________________ -->  

    <bean id="divisionManager" class="com.crimetrack.service.DivisionManager">
        <property name="divisionDao" ref="divisionDao"/>
    </bean>    
    <bean id="divisionDao" class="com.crimetrack.jdbc.JdbcDivisionDAO">
        <property name="dataSource" ref="dataSource"/>
    </bean>

<!-- __________________________________________________________________________________________________ -->    

     <bean id="positionManager" class="com.crimetrack.service.PositionManager">
        <property name="positionDao" ref="positionDao"/>
    </bean>    
    <bean id="positionDao" class="com.crimetrack.jdbc.JdbcPositionDAO">
        <property name="dataSource" ref="dataSource" />
    </bean>    

<!-- __________________________________________________________________________________________________ -->    

    <bean id="genderManager" class="com.crimetrack.service.GenderManager">
        <property name="genderDao" ref="genderDao"/>
    </bean>

    <bean id="genderDao" class="com.crimetrack.jdbc.JdbcGenderDAO" >
        <property name="dataSource" ref="dataSource" />
    </bean>

<!-- __________________________________________________________________________________________________ --> 

    <bean id="officerRegistrationValidation" class="com.crimetrack.service.OfficerRegistrationValidation">

            <property name="validateUserNameManager" ref="validateUserNameManager"/>


    </bean>

    <bean id="validateUserNameManager" class="com.crimetrack.service.ValidateUserNameManager">
            <property name="officerDao" ref="officerDao"/>
    </bean>


    <bean id="officerDao" class="com.crimetrack.jdbc.JdbcOfficersDAO" >
            <property name="dataSource" ref="dataSource" />
    </bean>

<!-- __________________________________________________________________________________________________ --> 


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="${jdbc.driverClassName}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
    </bean>
<!-- __________________________________________________________________________________________________ -->    

    <bean id="propertyConfigurer" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>
<!-- __________________________________________________________________________________________________ -->    

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


  </beans>

1。选项卡超出用户名字段时的错误日志

1882370 [http-8084-1] DEBUG org.springframework.web.bind.annotation.support.HandlerMethodInvoker  - Invoking request handler method: public java.lang.String com.crimetrack.web.OfficerRegistrationController.validateUserName(java.lang.String) throws java.lang.Exception
1882370 [http-8084-1] INFO  com.crimetrack.web.OfficerRegistrationController  - Inside OfficerRegistrationController
1882370 [http-8084-1] INFO  com.crimetrack.web.OfficerRegistrationController  - In try ..... catch for OfficerRegistrationController
1882370 [http-8084-1] INFO  com.crimetrack.service.ValidateUserNameManager  - Inside ValidateUserNameManager
1882370 [http-8084-1] INFO  com.crimetrack.service.ValidateUserNameManager  - ValidateUserNameManager - UserName is : admin
1882371 [http-8084-1] ERROR com.crimetrack.service.ValidateUserNameManager  - Message
java.lang.NullPointerException
    at com.crimetrack.service.ValidateUserNameManager.DoesUserNameExist(ValidateUserNameManager.java:26)
    at com.crimetrack.web.OfficerRegistrationController.validateUserName(OfficerRegistrationController.java:140)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)
1882371 [http-8084-1] INFO  com.crimetrack.service.ValidateUserNameManager  - ValidateUserNameManager - UserName :admin EXCEPTION OCCURED java.lang.NullPointerException

2.表单POST到控制器时的错误日志:

1135560 [http-8084-1] DEBUG org.springframework.beans.TypeConverterDelegate  - Converting String to [class java.lang.String] using property editor [org.springframework.beans.propertyeditors.StringTrimmerEditor@1983ad7]
1135560 [http-8084-1] INFO  com.crimetrack.service.OfficerRegistrationValidation  - OfficerRegistrationValidation - UserName is not null so going to check if its valid for :admin
1135560 [http-8084-1] INFO  com.crimetrack.service.OfficerRegistrationValidation  - OfficerRegistrationValidation - Just before try.....catch block...userName is :admin
1135560 [http-8084-1] INFO  com.crimetrack.service.OfficerRegistrationValidation  - OfficerRegistrationValidation - about to evaluate if (validateUserNameManager.DoesUserNameExist(officer.getUserName()) == true)
1135560 [http-8084-1] INFO  com.crimetrack.service.OfficerRegistrationValidation  - OfficerRegistrationValidation - Error Occured When validating UserName
1135561 [http-8084-1] ERROR com.crimetrack.service.OfficerRegistrationValidation  - Message
java.lang.NullPointerException
    at com.crimetrack.service.OfficerRegistrationValidation.validate(OfficerRegistrationValidation.java:61)
    at org.springframework.validation.DataBinder.validate(DataBinder.java:725)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:815)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:367)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)

1 个答案:

答案 0 :(得分:2)

当您在控制器new OfficerRegistrationValidation()中执行initBinder时,会得到一个validateUserNameManager为空的实例,因此是NPE。 Spring不会为你自动“填充”类字段,你需要要求它。

此外,您的控制器似乎会在字段(类级别)上存储每个用户的内容,但如果两个用户要求同一页面会怎么样。

我会建议这样的事情:

@Controller
public class OfficerRegistrationController {

    private final Logger logger = Logger.getLogger(getClass());

    @Autowire // tells spring to populates that for us.
    private DivisionManager divisionManager;

    @Autowire
    private PositionManager positionManager;

    @Autowire
    private GenderManager genderManager;

    @Autowire
    private OfficerRegistrationValidation officerRegistrationValidation;

    @InitBinder("officers")
    protected void initBinder(WebDataBinder binder){
        //removes white spaces 
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));

        //formats date 
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        //By passing true this will convert empty strings to null
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
        dateFormat.setLenient(false);


        logger.info("Just before initBinder");
        binder.setValidator(officerRegistrationValidation);
    }

    @RequestMapping(value="officer_registration.htm", method = RequestMethod.GET)
    public ModelAndView loadPage(HttpServletRequest request, HttpServletResponse response,@ModelAttribute Officers officer, BindingResult result, ModelMap m, Model model) throws Exception {
        // ... 
    }

    @RequestMapping(value="officer_registration.htm", method=RequestMethod.POST)
    public ModelAndView handleRequest(@Valid @ModelAttribute Officers officer, BindingResult result, ModelMap m, Model model) throws Exception{
        // ...
    }

    @RequestMapping(value="validateUserName.htm", method=RequestMethod.GET)
    public @ResponseBody String validateUserName(@RequestParam String userName) throws Exception{
        // ...
    }
}

@Component
public class OfficerRegistrationValidation implements Validator {

    private final Logger logger = Logger.getLogger(getClass());

    @Autowire
    ValidateUserNameManager validateUserNameManager;

    public boolean supports(Class<?> clazz) {
        return Officers.class.equals(clazz);
    }

    public void validate(Object target, Errors errors) {
        // ...
    }
}

@Service
public class ValidateUserNameManager implements ValidateUserNameIFace {

    private final Logger logger = Logger.getLogger(getClass());

    @Autowire
    private OfficersDAO officerDao;

    public boolean doesUserNameExist(String userName) throws Exception {
        // ...
    }
}

@Repository
public class OfficersDAO {
    // ...
}

注意类上的@Component@Service@Repository,这告诉spring在上下文启动时为这些类创建一个bean(参见<context:annotation-config/>和{{1 } docs)。 <context:component-scan base-package="..." />告诉spring尝试将带注释的字段与一个现有bean匹配(使用它的类型)。

整个想法是有三层:控制器,服务和daos;

  • 控制器使用服务
  • 服务使用daos。

我也建议一些好读:):