0
votes

I am getting this error when i am trying to insert manually to MySql table with hibernate. I am trying to insert some default data to my application but while inserting manually i am getting Null pointer exception. I am new in java programming so can't able to understand how to fix this error. If anyone can help me with this would me really appreciated..

User_Role Class :

package com.sanjay31321.sys.model;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity @Table(name="user_role")
public class User_Role {

    @Id @Column @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="role_name")
    private String name;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

InsertUserRole

import org.springframework.beans.factory.annotation.Autowired;

import com.sanjay31321.sys.model.User_Role;
import com.sanjay31321.sys.service.UserRoleService;

public class InsertUserRole {
    private static final Logger logger = LoggerFactory.getLogger(InsertUserRole.class);

    @Autowired
    private UserRoleService userRoleService;

    public void insert() {
        User_Role role = new User_Role();

        role.setId(1);
        role.setName("ROLE_ADMIN");
        logger.info("id : "+ role.getId() + " | Role : " + role.getName());
        userRoleService.addUserRole(role);
    }
}

Error:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause

java.lang.NullPointerException com.sanjay31321.sys.preset.data.InsertUserRole.insert(InsertUserRole.java:22) com.sanjay31321.sys.preset.DefaultDataInstall.install(DefaultDataInstall.java:23) com.sanjay31321.sys.controller.DefaultDataController.postinstall(DefaultDataController.java:31) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:601) org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) javax.servlet.http.HttpServlet.service(HttpServlet.java:641) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

DefaultDataController class

package com.sanjay31321.sys.controller;

import java.util.Locale;

import javax.validation.Valid;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.sanjay31321.sys.preset.DefaultDataInstall;
import com.sanjay31321.sys.preset.model.Install;

@Controller
public class DefaultDataController {
    private static final Logger logger = LoggerFactory.getLogger(DefaultDataController.class);

    @RequestMapping(value = "/install", method = RequestMethod.GET)
    public String getinstall(Locale locale, Install install) {
        logger.info("Welcome to Install Default Settings page ! GET METHOD : The client locale is {}.", locale);
        return "install";
    }

    @RequestMapping(value="/install", method=RequestMethod.POST)
    public String postinstall(@Valid  Install install, BindingResult result, Locale locale){
        logger.info("Welcome to Install Default Settings page ! POST METHOD : The client locale is {}.", locale);
        DefaultDataInstall settings = new DefaultDataInstall();
        settings.install();
        return "install";
    }
}

DefaultDataInstall class

package com.sanjay31321.sys.preset; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sanjay31321.sys.preset.data.InsertCourse; import com.sanjay31321.sys.preset.data.InsertFeedback; import com.sanjay31321.sys.preset.data.InsertQuestion; import com.sanjay31321.sys.preset.data.InsertQuestionSet; import com.sanjay31321.sys.preset.data.InsertStudent; import com.sanjay31321.sys.preset.data.InsertSubject; import com.sanjay31321.sys.preset.data.InsertTeacher; import com.sanjay31321.sys.preset.data.InsertUser; import com.sanjay31321.sys.preset.data.InsertUserRole; public class DefaultDataInstall { private static final Logger logger = LoggerFactory.getLogger(DefaultDataInstall.class); public void install() { InsertUserRole role = new InsertUserRole(); role.insert(); logger.info("User Role data is installed"); } }

I have attached the classes you asked.

1
Show us the code of DefaultDataController.java. How does it get its instance of InsertUserRole?JB Nizet

1 Answers

0
votes

I saw you code on github.

It is showing that error because userRoleService in InsertUserRole is null. so you can not call any method on it.

Why?

You creating InsertUserRole object using new keyword in DefaultDataInstall. @Autowired don't work when you do that it only works when DefaultDataInstall is also instantiated by spring. Spring can only inject something in an object only if it is creating it.

How to fix it.

Instantiate all the objects inside the preset package i.e mark them as @Component.

Other way is that You inject ApplicationContext in the controller and pass it to the objects you are creating and get the services from the AppContext.

@Controller
public class DefaultDataController {
    private static final Logger logger = LoggerFactory.getLogger(DefaultDataController.class);

    @Autowired private ApplicationContext applicationContext;   

    @RequestMapping(value="/install", method=RequestMethod.POST)
    public String postinstall(@Valid  Install install, BindingResult result, Locale locale){
        logger.info("Welcome to Install Default Settings page ! POST METHOD : The client locale is {}.", locale);       
        DefaultDataInstall settings = new DefaultDataInstall(applicationContext);//create a constructor which acceps ApplicationContext object
        settings.install();
        return "install";
    }

    //other code
}

Pass the ApplicationContext object to all the order objects where you want to use spring beans.

public class DefaultDataInstall {

    private static final Logger logger = LoggerFactory.getLogger(DefaultDataInstall.class);
    private ApplicationContext applicationContext;

    public DefaultDataInstall(ApplicationContext applicationContext){
        this.applicationContext = applicationContext;
    }

    public void install() {

        InsertUserRole role = new InsertUserRole();
        role.setUserRoleService(applicationContext.getBean("userRoleServiceImpl"));
        role.insert();
        logger.info("User Role data is installed");

        //other stuff
    }
}

Now you can use the passed service to call methods on them

public class InsertUserRole {
    private static final Logger logger = LoggerFactory.getLogger(InsertUserRole.class);

    private UserRoleService userRoleService;

    public void setUserRoleService(UserRoleService){
        this.userRoleService = userRoleService;
    }

    //other code
}