Java 获取抽象类上的自定义bean
Java 获取抽象类上的自定义bean,java,spring,Java,Spring,我有一个类,它从application.properties获取配置,以创建连接到数据库的驱动器(我使用jdbc连接到我的数据库):
我还有一个名为JdbcDao的抽象类,用于创建连接数据库所需的所有工具:
@Component
public class JdbcConfiguration {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.use
我有一个类,它从application.properties获取配置,以创建连接到数据库的驱动器(我使用jdbc连接到我的数据库):
我还有一个名为JdbcDao的抽象类,用于创建连接数据库所需的所有工具:
@Component
public class JdbcConfiguration {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String user;
@Value("${spring.datasource.driver-class-name}")
private String driver;
@Value("${spring.datasource.password}")
private String password;
@Bean
public void setUpDriver() {
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setUrl(url);
driverManagerDataSource.setUsername(user);
driverManagerDataSource.setPassword(password);
driverManagerDataSource.setDriverClassName(driver);
}
}
@Component
public abstract class JdbcDao {
@Autowired
private ApplicationContext context;
@Autowired
private JdbcConfiguration jdbcConfiguration;
private JdbcTemplate jdbcTemplateObject;
public JdbcDao() {
JdbcConfiguration a = context.getBean(JdbcConfiguration.class);
DriverManagerDataSource driver = context.getBean(DriverManagerDataSource.class);
this.jdbcTemplateObject = new JdbcTemplate(driver);
}
public JdbcTemplate getJdbcTemplateObject() {
return jdbcTemplateObject;
}
}
然后,我得到了jdbc抽象类的具体表示:
public class JdbcUserDao extends JdbcDao implements UserDao {
public JdbcUserDao() {
super();
}
@Override
public void save(User entity) {
System.out.println("save");
}
@Override
public void delete(User entity) {
System.out.println("delete");
}
@Override
public User findById(Long id) {
return getJdbcTemplateObject().queryForObject(QueryConstants.User.GET_USER_BY_ID, new Object[] { id },
new UserMapper());
}
}
但是,当我创建新的JdbcUserDao()时,我有一个NPE,因为没有注入应用程序上下文,这会在尝试获取自定义bean时导致空指针
为什么没有注入applicationContext?我怎样才能解决这个问题
编辑:
java.lang.NullPointerException:null
在com.arqsoft.gorgeousSandwich.data.jdbc.JdbcDao.(JdbcDao.java:25)~[classes/:na]
在com.arqsoft.gorgeousSandwich.data.jdbc.JdbcUserDao.(JdbcUserDao.java:15)~[classes/:na]
在com.arqsoft.gorgeousSandwich.data.DatabaseFactory.getConnectionType(DatabaseFactory.java:20)~[classes/:na]
在com.arqsoft.gorgeousSandwich.services.user.impl.UserService.getUser(UserService.java:18)~[classes/:na]
在com.arqsoft.gorgeousSandwich.controllers.UserController.index(UserController.java:19)~[classes/:na]
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0\u 231]
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)~[na:1.8.0\u 231]
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:1.8.0\u 231]
在java.lang.reflect.Method.invoke(Method.java:498)~[na:1.8.0\u 231]
在org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.servlet.mvc.method.annotation.ServletinInvocableHandlerMethod.invokeAndHandle(ServletinInvocableHandlerMethod.java:105)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在javax.servlet.http.HttpServlet.service(HttpServlet.java:626)~[tomcat-embed-core-9.0.39.jar:4.0.FR]
在org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在javax.servlet.http.HttpServlet.service(HttpServlet.java:733)~[tomcat-embed-core-9.0.39.jar:4.0.FR]
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)~[tomcat-embed-core-9.0.39.jar:9.0.39]
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39]
在org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)~[tomcat-embed-websocket-9.0.39.jar:9.0.39]
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)~[tomcat-embed-core-9.0.39.jar:9.0.39]
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39]
在org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)~[tomcat-embed-core-9.0.39.jar:9.0.39]
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39]
在org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)~[tomcat-embed-core-9.0.39.jar:9.0.39]
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39]
在org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)~[tomcat-embed-core-9.0.39.jar:9.0.39]
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39]
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.j
@Value("${connection.type}")
private String connectionType;
public UserDao getConnectionType() {
DatabaseConnectionType type = DatabaseConnectionType.getDatabaseConnectionType(connectionType);
switch(type) {
case JDBC_CONNECTION:
return new JdbcUserDao();
case JPA_CONNECTION:
return new JpaUserDao();
default:
throw new NoDatabaseConfigExceotion(); //EXAMPLE EXCEPTION
}
}
@Service
public class UserService implements IUserService {
@Autowired
DatabaseFactory userDatabaseConnection;
@Override
public User getUser(Long id) {
return userDatabaseConnection.getConnectionType().findById(id);
}
}