如何使用Spring自动装配注解的web应用程序

问题描述 投票:2回答:4

新来春,我冲进这是由于我的项目的需求。我能成功使用它作为一个Java应用程序时使用的大部分春季的特点,但我没有得到在Web应用程序所期望的结果。

我想我的初始化数据源中的applicationContext.xml:

<context:annotation-config />
<context:component-scan base-package="learn.spring.webapp.dao" />

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql://localhost:5432/postgres" />
    <property name="username" value="postgres" />
    <property name="password" value="postgres" />
</bean>

<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate"
    autowire="constructor" />

veb.hml:

 <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/spring/applicationContext.xml</param-value>
  </context-param>

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

我能成功在我的应用程序初始化春天,但不能在我的DAO类自动装配的JdbcTemplate。

package learn.spring.webapp.dao;

import learn.spring.webapp.model.Manga;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class MangaDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void insert(Manga manga){
        String sql = "insert into manga_list values (?,?)";
        jdbcTemplate.update(sql,
                new Object[]{manga.getName(), manga.getAuthor()}); //Null Pointer exception
    }
}

我想自动装配的template豆与JdbcTemplate在吾道包。我得到一个NullPointerException当我尝试使用JdbcTemplateMangaDao正在从一个servlet调用。我想我可能无法正常使用自动装配Autowired注解来。请指教。

编辑:

调用DAO的servlet代码是:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        MangaDao md=new MangaDao();
        Manga manga=new Manga();
        manga.setName("Bleach");
        manga.setAuthor("Kubo Tite");
        md.insert(manga);
    }

和堆栈跟踪如下:

SEVERE: Servlet.service() for servlet TesterServlet threw exception
java.lang.NullPointerException
        at learn.spring.webapp.dao.MangaDao.insert(MangaDao.java:16)
        at learn.spring.webapp.controller.TesterServlet.doGet(TesterServlet.java:33)
        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:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)
java spring
4个回答
4
投票

我想在你的servlet代码是这样的:

Manga manga = new Manga();
manga.setName(request.getParameter("name"));
manga.setAuthor(request.getParameter("author"));
MangaDao dao = new MangaDao();
dao.insert(manga); // here you get exception;

但是,只有当你从上下文中获取Bean的自动装配工作。

MangaDao dao = appContext.getBean(MangaDao.class);
dao.insert(manga); // should be ok;

所以,在这里你可以得到appContext。你应该从文件加载和存储furure使用。 ContextLoaderListener的做这件工作对你的一部分。然后你仅仅将其存储在静态变量,例如:

@Component
public class AppContext implements ApplicationContextAware {
    private static MangaDao mangaDao = null;
    public static MangaDao getMangaDao() {
        if(mangaDao == null){
            throw new ApplicationContextException("context not initialized");
        }
        return mangaDao;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        mangaDao = applicationContext.getBean(MangaDao.class);
    }
}

确保类AppContext进去封装,context:component-scan定义的,它会在你的情况learn.spring.webapp.dao

我强烈建议你使用的交易。


2
投票

要回答你的更新的帖子:

你必须使用你在你的环境中创建的豆,而不是创建一个新的实例。尝试自动装配新的组件,然后使用,而不是建立在你的控制器一个新的。

@Autowired MangaDao mangaDao;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Manga manga=new Manga();
    manga.setName("Bleach");
    manga.setAuthor("Kubo Tite");
    mangaDao.insert(manga);
}

在回答您的原帖:

看起来你只是缺少在组件扫描正确的包名。你@Component注解类是在learn.spring.webapp.model包和您的扫描没有达到它。尝试在注释扫描使用更为通用的软件包:

<context:component-scan base-package="learn.spring.webapp" />

0
投票

我会建议使用spring-mvc而不是原始的Servlet。

随着spring-mvc定义控制器而不使用servlet。基于您的代码Spring的控制器可以是这个样子:

@Controller 
public class MangaController {

    @Autowired
    private MangaDao dao;

    @RequestMapping(value = "/manga/insert", method = RequestMethod.GET)
    public void doGet() {
        Manga manga = new Manga();
        manga.setName("Bleach");
        manga.setAuthor("Kubo Tite");
        dao.insert(manga);
    }
}

因为控制器是由Spring管理所有需要的依赖将被注入,并准备通过您的代码中使用 - 消除NullPointerException

在您applicationContext.xml,你必须包括在元件扫描控制器封装,还使MVC的特点:

<mvc:annotation-driven />

我强烈建议在开始使用this article阅读spring-mvc。它涵盖了所有你需要的Spring的依赖沿着所需的步骤。

我也建议考虑看看通过Spring Reference documentation,如你所见,这是非常全面!


0
投票

我已经得到了同样的“零”异常,直到我的用户“SpringBeanAutowiringSupport”抽象类。你应该像这个抽象类扩展类:

public class SomeClass extends SpringBeanAutowiringSupport {}
© www.soinside.com 2019 - 2024. All rights reserved.