【问题标题】:Null pointer exception when using @Autowired annotation to inject bean使用@Autowired注解注入bean时出现空指针异常
【发布时间】:2014-11-19 02:09:15
【问题描述】:

当我使用@Autowired注解将dao注入服务时,发生java.lang.NullPointerException。我无法修复它。请任何人帮助!

例外

java.lang.NullPointerException
at com.sargeras.login.service.LoginServiceImpl.register(LoginServiceImpl.java:14)

服务

public class LoginServiceImpl implements LoginService{
@Autowired
private LoginDao loginDao;
public int register(UserVo userVo){
    return loginDao.register(userVo);
}
}

道

@Repository
public class LoginDaoImpl extends JdbcDaoSupport implements LoginDao {
@Override
public int register(UserVo userVo) {
    int result = -1;
    return result;
}

springmvc.xml

<context:component-scan base-package="com.sargeras" />
<mvc:annotation-driven />

applicationContext.xml

<bean name="loginService" class="com.sargeras.login.service.LoginServiceImpl">
</bean>
<bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />
    <property name="username" value="sargeras" />
    <property name="password" value="sargeras" />
</bean>
<bean name="loginDao" class="com.sargeras.login.repository.LoginDaoImpl">
    <property name="dataSource" ref="dataSource"></property>
</bean>

控制器

@Controller
@RequestMapping(value = "/login")
public class LoginController extends BaseController{
@Autowired
private LoginService service;
@RequestMapping(value = "validate")
public void toLogin(HttpServletResponse response) throws Exception {
    logger.error("hhhh");
    response.getWriter().print(" this is to logging 1");
}
@RequestMapping(value="register")
public void register(HttpServletRequest request,HttpServletResponse response) throws   Exception{
    UserVo user = new UserVo();
    int result = 0;
    String userName = (String)request.getParameter("usernamesignup");
    String userPassword = (String)request.getParameter("passwordsignup_confirm");
    String userEmail = (String)request.getParameter("emailsignup");
    user.setUserName(userName);
    user.setUserPassword(userPassword);
    user.setUserEmail(userEmail);
    result = service.register(user);
    if(result == 1){
        response.getWriter().print("Success");
    }
}
}

服务在控制器中使用,可以成功注入

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>spring_test</display-name>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/config/applicationContext*.xml</param-value>
</context-param>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.xml</param-value>
 </context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/config/spring-servlet.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

** 这是我的 web.xml 配置**

**问题解决如下**

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/config/spring-servlet.xml,
        classpath:/config/applicationContext*.xml
        </param-value>
    </init-param>
</servlet>

应用上下文和servlet上下文不能混用,我会记住的。谢谢大家!

【问题讨论】:

  • 告诉我们你在哪里使用loginService bean。
  • 现在可以弹出 Autowire 私有字段还是示例中未显示设置器?
  • @LorenzoBoccaccia 是的,支持私有字段注入
  • 奇怪的是,它可以成功注入控制器,但不能让它在服务中工作。我错过了什么?
  • 您应该添加 以启用自动装配

标签: java spring spring-mvc nullpointerexception autowired


【解决方案1】:

您没有发布您的 servlet 配置,但我怀疑您正在混合应用程序上下文和 servlet 上下文。它们是两个独立的 bean 容器。这里讨论: applicationContext not finding Controllers for Servlet context

【讨论】:

    【解决方案2】:

    正如已经建议的那样,您确实混淆了 servletContext 和 applicationContext。要么让你的 servletContext(applicationContext.xml 文件) 导入 springmvc.xml 文件,要么将 mvc-annotation-driven 标记放在 applicationContext.xml 文件中。无论哪种方式,您都应该阅读有关如何正确构建上下文的信息。

    【讨论】:

      【解决方案3】:

      如上所述,放弃springmvc.xml并添加

      <context:component-scan base-package="com.sargeras" />
      <mvc:annotation-driven />
      

      到您的 applicationContext.xml。

      应该足够了

      【讨论】:

        猜你喜欢
        • 2013-04-10
        • 2018-02-26
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 2017-07-02
        相关资源
        最近更新 更多