自动装配注释在 DAO 类 中不起作用。使用 Spring
Autowired annotation not working in DAO classes. Using Spring
我正在尝试使用 Spring 框架 5 构建一个简单的注册和登录。我正在尝试通过实施 java 配置 classes 来避免 xml 配置.我还不想使用休眠,因为我想在使用简单但先进的休眠之前先学习使其与 spring jdbc 一起工作。我试图从 属性 文件加载数据库凭据。
我在提交注册表后收到此异常。
我尝试使用 println 方法和记录器显示错误,但由于某种原因我需要弄清楚它没有显示。所以这里有两件事
无法准确找到创建 NullpointerException 的原因,因为它说它是嵌套异常。我认为是数据库连接导致了这个问题,我很困惑为什么我没有 SQLDriver Class not found exception 如果它是数据库连接。
为什么我无法显示导致空异常的变量输出以及为什么我的记录器实现不显示任何错误详细信息。
我试过各种方法解决,都没有成功,浪费了很长时间。因此,我在这里寻求专家的帮助。
我认为我尝试加载数据库凭据以使数据库连接正常工作的方式不太顺利,因为我想数据源仍然为空,因此我想知道
如何使用 java 配置 class(不是 xml 方法)从 属性 文件加载数据库凭证并在 DAO 中使用它?
数据库-properties.properties
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tutorstudentdb1
jdbc.user=webadmin
jdbc.pass=Password1
DispatcherConfig class
package com.rabin.tutorstudent.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class DispatcherConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {PersistanceConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {SpringConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
持久性配置class
package com.rabin.tutorstudent.config;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
@PropertySource({"classpath:database-properties.properties"})
@ComponentScan({"com.rabin.tutorstudent"})
public class PersistanceConfig {
//env
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.user"));
dataSource.setPassword(env.getProperty("jdbc.pass"));
return dataSource;
}
}
Spring配置class
package com.rabin.tutorstudent.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc
//@ComponentScan({"com.rabin.tutorstudent"})
@PropertySource({"classpath:database-properties.properties"})
@ComponentScan(basePackages= "com.rabin.tutorstudent")
public class SpringConfig {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
UserDAOImpl
package com.rabin.tutorstudent.daoimpl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.rabin.tutorstudent.dao.UserDAO;
import com.rabin.tutorstudent.model.User;
public class UserDAOImpl implements UserDAO {
public final Logger logger = LoggerFactory.getLogger(UserDAOImpl.class);
@Autowired
private DataSource dataSource;
/*
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
System.out.print(dataSource);
}
*/
public void save(User user) {
String query = "insert into user (username, password, firstname, lastname, email, role) values (?,?,?,?,?,?)";
logger.debug(query);
Connection con = null;
logger.debug("Connection Initialization "+con);
PreparedStatement ps = null;
try {
logger.debug("Datasource value=" +dataSource);
con = dataSource.getConnection();
logger.info("Connection to db"+con);
System.out.println("Connection :"+con);
ps = con.prepareStatement(query);
//ps.setLong(parameterIndex, x);
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setString(3, user.getFirstName());
ps.setString(4, user.getLastName());
ps.setString(5, user.getEmail());
ps.setString(6, user.getRole());
int out = ps.executeUpdate();
if(out !=0){
System.out.println("Employee saved with id="+user.getId());
} else {
System.out.println("Employee save failed with id="+user.getId());
}
} catch (SQLException e) {
System.out.println("Sql error" +e.getMessage());
}
}
public User getById(Long id) {
// TODO Auto-generated method stub
return null;
}
public void update(User user) {
// TODO Auto-generated method stub
}
public void deleteById(Long id) {
// TODO Auto-generated method stub
}
public List<User> getAll() {
// TODO Auto-generated method stub
return null;
}
}
UserDAO
package com.rabin.tutorstudent.dao;
import java.util.List;
import com.rabin.tutorstudent.model.User;
public interface UserDAO {
//Create - insert
public void save(User user);
//Read - select
public User getById(Long id);
//Update - change
public void update(User user);
//Delete - Remove
public void deleteById(Long id);
// Get All
public List<User> getAll();
}
SignUpController
package com.rabin.tutorstudent.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.rabin.tutorstudent.daoimpl.UserDAOImpl;
import com.rabin.tutorstudent.model.User;
@Controller
public class SignUpController {
public final Logger logger = LoggerFactory.getLogger(SignUpController.class);
@Autowired
// sessionFactory;
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String signUp() {
return "register";
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public ModelAndView signUpPost(
@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("firstname") String firstname,
@RequestParam("lastname") String lastname,
@RequestParam("email") String email,
@RequestParam("role") String role) {
logger.debug("Inside signUpPost method.");
ModelAndView mv = new ModelAndView();
logger.info("Model view ="+mv);
User user = new User(username, password, email, firstname, lastname, role);
user.setUsername(username);
user.setPassword(password);
user.setFirstName(firstname);
user.setLastName(lastname);
user.setEmail(email);
user.setRole(role);
//dao call
UserDAOImpl uDAO = new UserDAOImpl();
//UserDAO uDAO = new UserDAO();
//User u = new User(username, password, email, firstname, lastname, role);
//uDAO.insertUser(u);
uDAO.save(user);
System.out.println("User Registered..");
return mv;
}
}
用户
package com.rabin.tutorstudent.model;
public class User {
private Long id;
private String username;
private String password;
private String email;
private String firstName;
private String lastName;
private String role;
public User() {
super();
}
public User(Long id, String username, String password, String email, String firstName, String lastName,
String role) {
super();
this.id = id;
this.username = username;
this.password = password;
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
this.role = role;
}
public User(String username, String password, String email, String firstName, String lastName, String role) {
super();
this.username = username;
this.password = password;
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
this.role = role;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
这是我的控制台输出,给出了嵌套的 NullpointerException。
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version: Apache Tomcat/8.5.38
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built: Feb 5 2019 11:42:42 UTC
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number: 8.5.38.0
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name: Windows 10
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version: 10.0
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture: amd64
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home: C:\Program Files\Java\jre1.8.0_152
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version: 1.8.0_152-b16
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor: Oracle Corporation
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE: C:\Users\G3\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME: C:\Users\G3\Downloads\apache-tomcat-8.5.38
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=C:\Users\G3\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=C:\Users\G3\Downloads\apache-tomcat-8.5.38
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=C:\Users\G3\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=C:\Users\G3\Downloads\apache-tomcat-8.5.38\endorsed
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=Cp1252
Feb 28, 2019 5:47:03 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jre1.8.0_152\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre1.8.0_152/bin/server;C:/Program Files/Java/jre1.8.0_152/bin;C:/Program Files/Java/jre1.8.0_152/lib/amd64;C:\Program Files (x86)\Intel\iCLS Client\;C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\Brackets\command;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\xampp\php;C:\ProgramData\ComposerSetup\bin;C:\Users\G3\AppData\Local\Programs\Python\Python37-32\Scripts\;C:\Users\G3\AppData\Local\Programs\Python\Python37-32\;C:\Users\G3\AppData\Local\Microsoft\WindowsApps;C:\Users\G3\AppData\Roaming\Composer\vendor\bin;C:\Users\G3\Desktop;;.]
Feb 28, 2019 5:47:03 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
Feb 28, 2019 5:47:04 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Feb 28, 2019 5:47:04 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
Feb 28, 2019 5:47:04 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Feb 28, 2019 5:47:04 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 702 ms
Feb 28, 2019 5:47:04 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Catalina]
Feb 28, 2019 5:47:04 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.5.38
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Feb 28, 2019 5:47:06 PM org.apache.catalina.core.ApplicationContext log
INFO: 1 Spring WebApplicationInitializers detected on classpath
Feb 28, 2019 5:47:06 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Feb 28, 2019 5:47:06 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Feb 28, 2019 5:47:08 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'dispatcher'
Feb 28, 2019 5:47:09 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Feb 28, 2019 5:47:09 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8009"]
Feb 28, 2019 5:47:09 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 5279 ms
Feb 28, 2019 5:47:40 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/tutorstudent] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at com.rabin.tutorstudent.daoimpl.UserDAOImpl.save(UserDAOImpl.java:41)
at com.rabin.tutorstudent.controller.SignUpController.signUpPost(SignUpController.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
在浏览器上输出
HTTP Status 500 – Internal Server Error
Type Exception Report
Message Request processing failed; nested exception is java.lang.NullPointerException
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:986)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause
java.lang.NullPointerException
com.rabin.tutorstudent.daoimpl.UserDAOImpl.save(UserDAOImpl.java:41)
com.rabin.tutorstudent.controller.SignUpController.signUpPost(SignUpController.java:53)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
问题不在于数据源初始化,它是从 属性 文件中获取值,因为在初始化时没有错误,但是,@Auotwired 在DAO 实现可能是因为您没有使用 @component
注释。 Spring 不知道它必须在 DAOImpl 中自动装配 data source
。
此外,为什么不在 SignUpController
中自动装配 UserDAO
您手中拿着 DI,并期待 Spring 为您自动装配一些东西。如果您打算自己实例化对象,那么您还应该设置数据源。
我建议您参考一些示例以简化此过程。
我正在尝试使用 Spring 框架 5 构建一个简单的注册和登录。我正在尝试通过实施 java 配置 classes 来避免 xml 配置.我还不想使用休眠,因为我想在使用简单但先进的休眠之前先学习使其与 spring jdbc 一起工作。我试图从 属性 文件加载数据库凭据。
我在提交注册表后收到此异常。
我尝试使用 println 方法和记录器显示错误,但由于某种原因我需要弄清楚它没有显示。所以这里有两件事
无法准确找到创建 NullpointerException 的原因,因为它说它是嵌套异常。我认为是数据库连接导致了这个问题,我很困惑为什么我没有 SQLDriver Class not found exception 如果它是数据库连接。
为什么我无法显示导致空异常的变量输出以及为什么我的记录器实现不显示任何错误详细信息。
我试过各种方法解决,都没有成功,浪费了很长时间。因此,我在这里寻求专家的帮助。
我认为我尝试加载数据库凭据以使数据库连接正常工作的方式不太顺利,因为我想数据源仍然为空,因此我想知道 如何使用 java 配置 class(不是 xml 方法)从 属性 文件加载数据库凭证并在 DAO 中使用它?
数据库-properties.properties
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tutorstudentdb1
jdbc.user=webadmin
jdbc.pass=Password1
DispatcherConfig class
package com.rabin.tutorstudent.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class DispatcherConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {PersistanceConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {SpringConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
持久性配置class
package com.rabin.tutorstudent.config;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
@PropertySource({"classpath:database-properties.properties"})
@ComponentScan({"com.rabin.tutorstudent"})
public class PersistanceConfig {
//env
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.user"));
dataSource.setPassword(env.getProperty("jdbc.pass"));
return dataSource;
}
}
Spring配置class
package com.rabin.tutorstudent.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc
//@ComponentScan({"com.rabin.tutorstudent"})
@PropertySource({"classpath:database-properties.properties"})
@ComponentScan(basePackages= "com.rabin.tutorstudent")
public class SpringConfig {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
UserDAOImpl
package com.rabin.tutorstudent.daoimpl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.rabin.tutorstudent.dao.UserDAO;
import com.rabin.tutorstudent.model.User;
public class UserDAOImpl implements UserDAO {
public final Logger logger = LoggerFactory.getLogger(UserDAOImpl.class);
@Autowired
private DataSource dataSource;
/*
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
System.out.print(dataSource);
}
*/
public void save(User user) {
String query = "insert into user (username, password, firstname, lastname, email, role) values (?,?,?,?,?,?)";
logger.debug(query);
Connection con = null;
logger.debug("Connection Initialization "+con);
PreparedStatement ps = null;
try {
logger.debug("Datasource value=" +dataSource);
con = dataSource.getConnection();
logger.info("Connection to db"+con);
System.out.println("Connection :"+con);
ps = con.prepareStatement(query);
//ps.setLong(parameterIndex, x);
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setString(3, user.getFirstName());
ps.setString(4, user.getLastName());
ps.setString(5, user.getEmail());
ps.setString(6, user.getRole());
int out = ps.executeUpdate();
if(out !=0){
System.out.println("Employee saved with id="+user.getId());
} else {
System.out.println("Employee save failed with id="+user.getId());
}
} catch (SQLException e) {
System.out.println("Sql error" +e.getMessage());
}
}
public User getById(Long id) {
// TODO Auto-generated method stub
return null;
}
public void update(User user) {
// TODO Auto-generated method stub
}
public void deleteById(Long id) {
// TODO Auto-generated method stub
}
public List<User> getAll() {
// TODO Auto-generated method stub
return null;
}
}
UserDAO
package com.rabin.tutorstudent.dao;
import java.util.List;
import com.rabin.tutorstudent.model.User;
public interface UserDAO {
//Create - insert
public void save(User user);
//Read - select
public User getById(Long id);
//Update - change
public void update(User user);
//Delete - Remove
public void deleteById(Long id);
// Get All
public List<User> getAll();
}
SignUpController
package com.rabin.tutorstudent.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.rabin.tutorstudent.daoimpl.UserDAOImpl;
import com.rabin.tutorstudent.model.User;
@Controller
public class SignUpController {
public final Logger logger = LoggerFactory.getLogger(SignUpController.class);
@Autowired
// sessionFactory;
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String signUp() {
return "register";
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public ModelAndView signUpPost(
@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("firstname") String firstname,
@RequestParam("lastname") String lastname,
@RequestParam("email") String email,
@RequestParam("role") String role) {
logger.debug("Inside signUpPost method.");
ModelAndView mv = new ModelAndView();
logger.info("Model view ="+mv);
User user = new User(username, password, email, firstname, lastname, role);
user.setUsername(username);
user.setPassword(password);
user.setFirstName(firstname);
user.setLastName(lastname);
user.setEmail(email);
user.setRole(role);
//dao call
UserDAOImpl uDAO = new UserDAOImpl();
//UserDAO uDAO = new UserDAO();
//User u = new User(username, password, email, firstname, lastname, role);
//uDAO.insertUser(u);
uDAO.save(user);
System.out.println("User Registered..");
return mv;
}
}
用户
package com.rabin.tutorstudent.model;
public class User {
private Long id;
private String username;
private String password;
private String email;
private String firstName;
private String lastName;
private String role;
public User() {
super();
}
public User(Long id, String username, String password, String email, String firstName, String lastName,
String role) {
super();
this.id = id;
this.username = username;
this.password = password;
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
this.role = role;
}
public User(String username, String password, String email, String firstName, String lastName, String role) {
super();
this.username = username;
this.password = password;
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
this.role = role;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
这是我的控制台输出,给出了嵌套的 NullpointerException。
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version: Apache Tomcat/8.5.38
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built: Feb 5 2019 11:42:42 UTC
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number: 8.5.38.0
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name: Windows 10
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version: 10.0
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture: amd64
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home: C:\Program Files\Java\jre1.8.0_152
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version: 1.8.0_152-b16
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor: Oracle Corporation
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE: C:\Users\G3\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME: C:\Users\G3\Downloads\apache-tomcat-8.5.38
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=C:\Users\G3\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=C:\Users\G3\Downloads\apache-tomcat-8.5.38
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=C:\Users\G3\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=C:\Users\G3\Downloads\apache-tomcat-8.5.38\endorsed
Feb 28, 2019 5:47:03 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=Cp1252
Feb 28, 2019 5:47:03 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jre1.8.0_152\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre1.8.0_152/bin/server;C:/Program Files/Java/jre1.8.0_152/bin;C:/Program Files/Java/jre1.8.0_152/lib/amd64;C:\Program Files (x86)\Intel\iCLS Client\;C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\Brackets\command;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\xampp\php;C:\ProgramData\ComposerSetup\bin;C:\Users\G3\AppData\Local\Programs\Python\Python37-32\Scripts\;C:\Users\G3\AppData\Local\Programs\Python\Python37-32\;C:\Users\G3\AppData\Local\Microsoft\WindowsApps;C:\Users\G3\AppData\Roaming\Composer\vendor\bin;C:\Users\G3\Desktop;;.]
Feb 28, 2019 5:47:03 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
Feb 28, 2019 5:47:04 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Feb 28, 2019 5:47:04 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
Feb 28, 2019 5:47:04 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Feb 28, 2019 5:47:04 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 702 ms
Feb 28, 2019 5:47:04 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Catalina]
Feb 28, 2019 5:47:04 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.5.38
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Feb 28, 2019 5:47:06 PM org.apache.catalina.core.ApplicationContext log
INFO: 1 Spring WebApplicationInitializers detected on classpath
Feb 28, 2019 5:47:06 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Feb 28, 2019 5:47:06 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Feb 28, 2019 5:47:08 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'dispatcher'
Feb 28, 2019 5:47:09 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Feb 28, 2019 5:47:09 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8009"]
Feb 28, 2019 5:47:09 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 5279 ms
Feb 28, 2019 5:47:40 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/tutorstudent] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at com.rabin.tutorstudent.daoimpl.UserDAOImpl.save(UserDAOImpl.java:41)
at com.rabin.tutorstudent.controller.SignUpController.signUpPost(SignUpController.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
在浏览器上输出
HTTP Status 500 – Internal Server Error
Type Exception Report
Message Request processing failed; nested exception is java.lang.NullPointerException
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:986)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause
java.lang.NullPointerException
com.rabin.tutorstudent.daoimpl.UserDAOImpl.save(UserDAOImpl.java:41)
com.rabin.tutorstudent.controller.SignUpController.signUpPost(SignUpController.java:53)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
问题不在于数据源初始化,它是从 属性 文件中获取值,因为在初始化时没有错误,但是,@Auotwired 在DAO 实现可能是因为您没有使用 @component
注释。 Spring 不知道它必须在 DAOImpl 中自动装配 data source
。
此外,为什么不在 SignUpController
中自动装配 UserDAO
您手中拿着 DI,并期待 Spring 为您自动装配一些东西。如果您打算自己实例化对象,那么您还应该设置数据源。
我建议您参考一些示例以简化此过程。