SpringMvc java.lang.NullPointerException When Post

2019-09-02 01:51发布

问题:

I have a form with a user name field on it when i tab out of the field i use a RESTFUL Web Service that makes a call to a handler method in the controller. The method makes a call to a DAO class that checks the database if the user name exists.

This works fine, however when the form is posted to the server i call the same exact function i would call in the handler method however i get a java.lang.NullPointerException when it accesses the class that makes a call to the DAO object. So it does not even access the DAO object the second time.

I have exception handlers around the calls in all my classes that makes calls. Any ideas as to whats happening here why i would get the java.lang.NullPointerException the second time the function is called.Does this have anything to do with Spring instantiating DAO classes using a Singleton method or something to that effect? What can be done to resolve this?

This is what happens the First Time The Method is called using the Web Service(this is suppose to happen):

13011 [http-8084-2] INFO  com.crimetrack.jdbc.JdbcOfficersDAO  - Inside jdbcOfficersDAO
13031 [http-8084-2] DEBUG org.springframework.jdbc.core.JdbcTemplate  - Executing prepared SQL query
13034 [http-8084-2] DEBUG org.springframework.jdbc.core.JdbcTemplate  - Executing prepared SQL statement [SELECT userName FROM crimetrack.tblofficers WHERE userName = ?]
13071 [http-8084-2] DEBUG org.springframework.jdbc.datasource.DataSourceUtils  - Fetching JDBC Connection from DataSource
13496 [http-8084-2] DEBUG org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 1, parameter value [adminz], value class [java.lang.String], SQL type unknown
13534 [http-8084-2] DEBUG org.springframework.jdbc.datasource.DataSourceUtils  - Returning JDBC Connection to DataSource
13537 [http-8084-2] INFO  com.crimetrack.jdbc.JdbcOfficersDAO  - No username was found in exception
13537 [http-8084-2] INFO  com.crimetrack.service.ValidateUserNameManager  - UserName :adminz does NOT exist

The Second time When The Form Is 'Post' and a validation method handles the form and calls the same method the web service would call:

17199 [http-8084-2] INFO  com.crimetrack.service.OfficerRegistrationValidation  - UserName is not null so going to check if its valid for :adminz
17199 [http-8084-2] INFO  com.crimetrack.service.OfficerRegistrationValidation  - User Name in try.....catch block is adminz
17199 [http-8084-2] INFO  com.crimetrack.service.ValidateUserNameManager  - Inside Do UserNameExist about to validate with username : adminz
17199 [http-8084-2] INFO  com.crimetrack.service.ValidateUserNameManager  - UserName :adminz EXCEPTION OCCURED java.lang.NullPointerException

ValidateUserNameManager.java

public class ValidateUserNameManager implements ValidateUserNameIFace {

    private OfficersDAO officerDao;

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


    public boolean DoesUserNameExist(String userName) throws Exception {

        logger.info("Inside Do UserNameExist about to validate with username : " + userName);

        try{

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

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

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


        }catch(Exception e){

            logger.info("UserName :" + userName + " EXCEPTION OCCURED " + e.toString());
            return false;
        }       

    }

    /**
     * @return the officerDao
     */
    public OfficersDAO getOfficerDao() {
        return officerDao;
    }

    /**
     * @param officerdao the officerDao to set
     */
    public void setOfficerDao(OfficersDAO officerDao) {
        this.officerDao = officerDao;
    }



}

JdbcOfficersDAO.java

public boolean OfficerExist(String userName){

    String dbUserName;

    try{

        logger.info("Inside jdbcOfficersDAO");


        String sql = "SELECT userName FROM crimetrack.tblofficers WHERE userName = ?";

        try{
            dbUserName = (String)getJdbcTemplate().queryForObject(sql, new Object[]{userName},String.class);
            logger.info("Just Returned from database");

        }catch(Exception e){
            logger.info("No username was found in exception");
            return false;
        }

        if(dbUserName == null){

            logger.info("Database did not find any matching records");
        }

        logger.info("after JdbcTemplate");

        if (dbUserName.equals(userName)) {

            logger.info("User Name Exists");
            return true;

        }else{
            logger.info("User Name Does NOT Exists");
            return false;
        }       

    }catch(Exception e){

        logger.info("Exception Message in JdbcOfficersDAO is "+e.getMessage());
        return false;
    }
}

OfficerRegistrationValidation.java

public class OfficerRegistrationValidation implements Validator{

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

    private 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("UserName is not null so going to check if its valid for :" + userName);
            try {

                logger.info("User Name in try.....catch block is " + userName);

                if (validateUserNameManager.DoesUserNameExist(userName)== true){

                    errors.rejectValue("userName", "userName.exist");
                }
            } catch (Exception e) {
                logger.info("Error Occured When validating UserName");
                errors.rejectValue("userName", "userName.error");
            }

        }

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

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


        if(officer.getfName() == null){
            errors.rejectValue("fName","fName.required");
        }

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

            errors.rejectValue("lName", "lName.required");
        }

        if (officer.getoName() == null){
            errors.rejectValue("oName", "oName.required");
        }

        if (officer.getEmailAdd() == null){
            errors.rejectValue("emailAdd", "emailAdd.required");
        }

        if (officer.getDob() == null){
            errors.rejectValue("dob", "dob.required");
        }

        if (officer.getGenderId().equals("A")){
            errors.rejectValue("genderId","genderId.required");
        }


        if(officer.getDivisionNo() == 1){

            errors.rejectValue("divisionNo", "divisionNo.required");
        }

        if(officer.getPositionId() == 1){

            errors.rejectValue("positionId", "positionId.required");
        }

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

            errors.rejectValue("startDate","startDate.required");
        }

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

            errors.rejectValue("endDate","endDate.required");
        }

        logger.info("The Gender ID is " + officer.getGenderId().toString());

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

            errors.rejectValue("phoneNo", "phoneNo.required");
        }

    }



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


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



}

Update Error Log using Logger.Error("Message", e):

39024 [http-8084-2] INFO  com.crimetrack.service.OfficerRegistrationValidation  - UserName is not null so going to check if its valid for :adminz
39025 [http-8084-2] INFO  com.crimetrack.service.OfficerRegistrationValidation  - User Name in try.....catch block is adminz
39025 [http-8084-2] ERROR com.crimetrack.service.OfficerRegistrationValidation  - Message
java.lang.NullPointerException
    at com.crimetrack.service.OfficerRegistrationValidation.validate(OfficerRegistrationValidation.java:47)
    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)
39025 [http-8084-2] INFO  com.crimetrack.service.OfficerRegistrationValidation  - Error Occured When validating UserName

UPDATED

ApplicationContext.xml

<beans>
<!-- __________________________________________________________________________________________________ --> 

    <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>

Servlet.xml

<beans>
<!-- __________________________________________________________________________________________________ --> 

     <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>

回答1:

I think you forget to autowire the officerDao field in ValidateUserNameManager.java

Try adding @Autowire :

@Autowire
private OfficersDAO officerDao;

Update:

After you updated your stack trace, I think it's the validateUserNameManager field in OfficerRegistrationValidation.java which is not autowired. However, this depends on what the line 47 is in OfficerRegistrationValidation.java



回答2:

The OfficerRegistrationValidation class was being instantiated in every call to it a Factory bean should be applied to handle the invocation if this class:

public final class BeanFactory() {

    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");
    }
}

In the controller make a call like : `BeanFactory.getOfficerRegistrationValidation().validate(....)