JDBCTemplate给出空指针异常?

时间:2016-07-07 00:03:58

标签: java mysql sql-server jdbc spring-boot

我正在尝试在表中插入一些值,并且我一直得到一个空指针异常。我首先想到的是因为有些值是null,但即使是那些永远不为null的值也给我NPE。

这是我的TwitterJDBCTemplate:

@Service
public class TwitterJDBCTemplate {


@Autowired
private DataSource dataSource;
private JdbcTemplate jdbcTemplateObject;




public void storeTweet(long id, long user_id, String created_at, String language, String message, String searchterm,
        String user_description, String user_location, String user_pic, String user_screenname, String username) {

    String SQL = "insert into tweets (id, user_id, created_at, language,"
            + "message, searchterm, user_description, user_location, user_pic,"
            + "user_screenname, username) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

    jdbcTemplateObject.update(SQL, new Object[] { id, user_id, created_at, language, message, searchterm,
            user_description, user_location, user_pic, user_screenname, username });
}

这是我的主要应用程序:

@SpringBootApplication
@EnableScheduling
public class TwitterApp {

public static void main(String[] args) {

    // TODO Auto-generated method stub
    SpringApplication.run(TwitterApp.class, args);

}
}

我的application.properties文件:

server.port: 9040
management.port: 9041
management.address: 127.0.0.1

spring.datasource.url=jdbc:mysql://localhost:3306/twitter

spring.datasource.username=root
spring.datasource.password=********

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect 

spring.jpa.show-sql=false

spring.jpa.hibernate.ddl-auto=create

我的TweetController内部:

@RestController
@Scope("singleton")
public class TweetController {


@Autowired
TwitterJDBCTemplate template;

2 个答案:

答案 0 :(得分:0)

您没有在应用中创建jdbcTemplate对象,这就是您获得NPE的原因。我认为有两种可选方案:

1)将jdbcTemplate bean添加到spring上下文并自动装配它。

    if self.user:
RuntimeError: maximum recursion depth exceeded

和你的班级

@Bean
public JdbcTemplate getJdbcTemplate() {
   return new JdbcTemplate(dataSource());
}

2)在你的类中创建jdbcTemplate

@Service
public class TwitterJDBCTemplate {


@Autowired
private JdbcTemplate jdbcTemplateObject;
.....
}

此外,我认为使用具有大量参数的方法不是最佳实践。也许你应该像这样创建自定义类Twit或smth。

答案 1 :(得分:0)

当然,您必须在代码中JdbcTemplate之前在应用程序上下文中创建@autowire bean

您可以在@Configuration课程中执行此操作。

  @Configuration
  public class DatabaseConfiguration {

           @Bean
           @Primary
           @ConfigurationProperties(prefix = "spring.datasource")
           public javax.sql.DataSource primaryDataSource() {
                   return DataSourceBuilder.create().build();
           }

           @Bean
           public JdbcTemplate getJdbcTemplate() {
                   return new JdbcTemplate(primaryDataSource());
           }

  }

根据this教程。添加此依赖项将负责为应用程序创建JdbcTemplate

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>

然后你可以@autowire如下,

@Autowired
private JdbcTemplate jdbcTemplate