2016-07-07 137 views
-1

我想插入一些值到我的表中,我不斷收到一個空指針異常。我首先想到這是因爲有些值是空的,但即使是從不爲零的值也會給我NPE。JDBCTemplate提供空指針異常?

這裏是我的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; 
+1

顯示完整的堆棧跟蹤(編輯問題,請不要在評論顯示)。 – Andreas

+1

在您的TwitterJDBCTemplate中,您既未初始化jdbcTemplateObject字段,也沒有Autowired註釋。 – dunni

回答

0

您沒有在您的應用程序中創建jdbcTemplate對象,這就是您獲得NPE的原因。我認爲有兩種可能的選擇:

1)將jdbcTemplate bean添加到spring上下文並自動裝入它。

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

而且你的類

@Service 
public class TwitterJDBCTemplate { 


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

2)類

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 

除了內部創建的JdbcTemplate我bielive,它不是使用大數量則params的方法的最佳實踐。也許你應該創建你的自定義類Twit或者像這樣做。

0

當然,你在你的應用程序上下文它在你的代碼之前,你@autowire創建JdbcTemplate

例如,您可以在@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