Home Articles

SpringMvc Hibernate:在手动将数据插入表时获取NullPointerException

Asked
Viewed 1907 times
0

当我尝试使用hibernate手动插入MySql表时,我收到此错误 . 我试图将一些默认数据插入我的应用程序,但手动插入时我得到Null指针异常 . 我是java编程的新手,所以无法理解如何修复此错误 . 如果有人可以帮助我,我真的很感激..

User_Role类:

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

我附上了你问过的课程 .

1 Answer

  • 0

    我在github上看到你的代码 .

    它显示该错误,因为 InsertUserRole 中的 userRoleService 为空 . 所以你不能在它上面调用任何方法 .

    Why?

    您在 DefaultDataInstall 中使用 new 关键字创建 InsertUserRole 对象 . @Autowired 当你这样做时不起作用它只有当 DefaultDataInstall 也被spring实例化时才有效 . Spring只能在创建对象时才注入某个对象 .

    如何解决它 .

    实例化 preset 包中的所有对象,即将它们标记为 @Component .

    另一种方法是在控制器中注入ApplicationContext并将其传递给您正在创建的对象,并从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
    }
    

    ApplicationContext 对象传递给要使用spring bean的所有订单对象 .

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

    现在,您可以使用传递的服务来调用它们的方法

    public class InsertUserRole {
        private static final Logger logger = LoggerFactory.getLogger(InsertUserRole.class);
    
        private UserRoleService userRoleService;
    
        public void setUserRoleService(UserRoleService){
            this.userRoleService = userRoleService;
        }
    
        //other code
    }
    

Related