- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一般信息: Spring Boot 新手,想要通过单元测试测试我的 JDBC 连接。我创建了一个简单的类来连接到我的数据库,并创建了一个简单的测试类来跟进正确的测试用例。
问题:执行jdbcTemplate.getDataSource().getConnection();时连续收到java.lang.NullPointerException;
我很难理解为什么。我尝试使用不同的数据库,并确保可以与常规 JDBC 建立连接。我已经提到了 Stack Overflow 上的许多其他问题,但过去两天我仍然停留在这个问题上,没有任何进展。我什至尝试使用不同类型的数据源库,但它们都产生相同的结果。
问题:我该如何解决这个问题?如果有人也能解释为什么会出现这个问题,以及为什么我们需要在企业级使用 Spring JDBC,那就太好了。
<小时/>我的代码:
DatabaseTableService.java
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.vertica.jdbc.DataSource;
@RestController
@RequestMapping("/databaseServices")
public class DatabaseTableService {
private JdbcTemplate jdbcTemplate;
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource= dataSource;
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@RequestMapping("/testConnection")
@ResponseBody
public boolean canConnectToDB() {
boolean result;
try {
jdbcTemplate.getDataSource().getConnection();
result = true;
} catch (Exception e) {
e.printStackTrace();
result = false;
}
return result;
}
}
<小时/>beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.company.project"></context:component-scan>
<mvc:annotation-driven/>
<bean id="dataSource"
class="com.vertica.jdbc.DataSource">
<property name="URL" value="DBURLHERE"/>
<property name="userID" value="USERIDHERE"/>
<property name="password" value="PASSWORDHERE"/>
</bean>
<bean id="databaseTableService"
class="com.company.project.services.DatabaseTableService">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
<小时/>
DatabaseTableServiceTest.java
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import com.vertica.jdbc.DataSource;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ApplicationController.class)
@WebAppConfiguration
public class DatabaseTableServiceTest {
@Autowired
private WebApplicationContext webApplicationContext;
private JdbcTemplate jdbcTemplate;
private MockMvc mockMvc;
DatabaseTableService databaseTableServiceObject;
DataSource testDataSource = new DataSource();
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
.build();
databaseTableServiceObject = new DatabaseTableService();
}
@Test
public void setDataSource() throws Exception {
databaseTableServiceObject.setDataSource(testDataSource);
}
@Test
public void validateCanConnectToDB() throws Exception {
Assert.assertTrue(databaseTableServiceObject.canConnectToDB());
}
@After
public void tearDown() throws Exception {
mockMvc = null;
databaseTableServiceObject = null;
testDataSource = null;
}
}
<小时/>
ApplicationController.java
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
@SpringBootApplication
@ImportResource({"beans.xml"})
@ComponentScan(basePackages = "com.company.project")
public class ApplicationController {
public static void main(String[] args) throws Exception {
SpringApplication.run(ApplicationController.class, args);
}
}
<小时/>
文件夹结构
<小时/>最佳答案
您正在使用 Spring Boot,接下来请努力不要使用。从您的 ApplicationController
中删除您的 beans.xml
和 @ImportResource
(顺便说一句,它不是 Controller ,而是您的实际应用程序,因为您的服务是您的实际控制人)。另外假设您的 ApplicationController
位于同一个包中,您也可以删除 @ComponentScan
。
然后在您的application.properties
中添加以下内容
spring.datasource.url=<your-url>
spring.datasource.username=<your-username>
spring.datasource.password=<your-password>
spring.datasource.type=com.vertica.jdbc.DataSource
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
Spring Boot 将为您创建一个 DataSource
和一个 JdbcTemplate
,因此无需您自己创建。只需在类中添加 @Autowire
JdbcTemplate
即可。
@RestController
@RequestMapping("/databaseServices")
public class DatabaseTableService {
private final JdbcTemplate jdbcTemplate;
@Autowired
public DatabaseTableService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate=jdbcTeplate;
}
@RequestMapping("/testConnection")
@ResponseBody
public boolean canConnectToDB() {
boolean result;
try {
jdbcTemplate.getDataSource().getConnection();
result = true;
} catch (Exception e) {
e.printStackTrace();
result = false;
}
return result;
}
}
现在你的测试,相当困惑。您正在使用 Spring 但自己做事情,所以不确定您想要在那里实现什么。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ApplicationController.class)
@WebAppConfiguration
public class DatabaseTableServiceTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
private DatabaseTableService databaseTableServiceObject;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
.build();
}
@Test
public void setDataSource() throws Exception {
databaseTableServiceObject.setDataSource(testDataSource);
}
@Test
public void validateCanConnectToDB() throws Exception {
Assert.assertTrue(databaseTableServiceObject.canConnectToDB());
}
}
您只需@Autowired
即可使用现已完全构建的服务。
最后一件事是您的 canConnectToDB
方法有缺陷。您正在获取连接,但永远不会返回/关闭它。因此,在调用此方法几次后,您的应用程序将停止工作,因为连接池将耗尽或您的数据库停止接受连接。
简而言之,与框架一起工作,而不是反对/围绕框架。阅读文档,而不是试图绕过它。
关于java - 使用 Spring Boot JdbcTemplate 获取 java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36796368/
在 Tomcat 6/Ubuntu 12.04 上启动 Grails 2.1.0 应用程序时出现以下错误。 Error 500 - Internal Server Error. groovy.lang
在运行 Storm 拓扑时,我收到此错误。拓扑完美运行 5 分钟,没有任何错误,然后失败。我正在使用 Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS as 300 sec i
我有一个 jsp 代码在其中一台机器上运行良好。但是当我复制到另一台机器时,我得到了这个 no such method found 异常。我是 Spring 的新手。有人可以解释我错过了什么吗? 以下
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我的代码在下面给出了一个错误; Exception in thread "main" java.lang.NoSuchMethodError: com/myApp/Client.cypherCBC(L
我正在尝试一个 Restful web 服务示例,所以当我要访问 url 时,我遇到了异常 java.lang.NoSuchMethodError: jersey.repackaged.com.goo
我正在将一个 Spring web 项目转换为一个 Maven 项目,但我收到了这个错误: java.lang.NoSuchMethodError: org.jboss.logging.Logger.
在我的项目中,我有一个像这样的枚举: public enum MyEnum { FIRST(1), SECOND(2); private int value; private MyEnum(int v
我创建了这个简单的示例,用于读取 Linux 正常运行时间: public String getMachineUptime() throws IOException { String[] di
我正在使用 Eclipse,并且正在使用 Java。我的目标是使用 bogoSort 方法对 vector 进行排序在一个 vector (vectorExample)中适应我的 vector 类型,
我正在运行以下查询。它显示一条错误消息。如何解决这个错误? ListrouteList=null; List companyList = session.createS
我有以下模型类: @Entity @Table(name="user_content") @org.hibernate.annotations.NamedQueries({ @org.
我有那个错误。这是我的代码: GmailSettingsService service = new GmailSettingsService(APPLICATION_NAME, DOMAIN_NAME
实际上我在执行我的java程序时遇到了下面提到的错误 Exception in thread "pool-1-thread-1" java.lang.ClassCastException: jav
java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.String 我在以下代码中遇到此异常: Strin
我正在尝试从 linkedhashset 中检索随机元素。下面是我的代码,但它每次都给我异常。 private static void generateRandomUserId(Set userIds
我已经完成了 Android 中的代码: List spinnerArray = new ArrayList(); for (int i = 0; i item = (LinkedTreeMap)
这个问题已经有答案了: Explanation of ClassCastException in Java (12 个回答) 已关闭 6 年前。 我已经编写了 java 到 Json 的代码,同时从页
这个问题在这里已经有了答案: ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn (4 个答案) 关闭 6 年前
我在运行时遇到问题来编译这段代码,这给我一个错误,java.lang.Integer 无法转换为 Java.lang.Double。如果有人帮助我更正此代码,我将非常高兴 double x; pu
我是一名优秀的程序员,十分优秀!