新来春,我冲进这是由于我的项目的需求。我能成功使用它作为一个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
当我尝试使用JdbcTemplate
。 MangaDao
正在从一个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)
我想在你的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
我强烈建议你使用的交易。
要回答你的更新的帖子:
你必须使用你在你的环境中创建的豆,而不是创建一个新的实例。尝试自动装配新的组件,然后使用,而不是建立在你的控制器一个新的。
@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" />
我会建议使用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,如你所见,这是非常全面!
我已经得到了同样的“零”异常,直到我的用户“SpringBeanAutowiringSupport”抽象类。你应该像这个抽象类扩展类:
public class SomeClass extends SpringBeanAutowiringSupport {}