2016-07-07 8 views
-1

Ich versuche, einige Werte in meine Tabelle einzufügen, und ich bekomme immer eine Nullzeigerausnahme. Ich dachte zuerst, es wäre, weil einige Werte null waren, aber selbst mit denen, die niemals null sind, gib mir NPE.JDBCTemplate gibt Null-Zeiger-Ausnahme?

Hier ist meine 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 }); 
} 

Hier ist meine Haupt App:

@SpringBootApplication 
@EnableScheduling 
public class TwitterApp { 

public static void main(String[] args) { 

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

} 
} 

Meine application.properties Datei:

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 

Innerhalb meiner TweetController:

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


@Autowired 
TwitterJDBCTemplate template; 
+1

zeigen die volle stacktrace (edit Frage, zeigen nicht in einem Kommentar). – Andreas

+1

In Ihrem TwitterJDBCTemplate wird weder die Autowriting-Annotation noch das Feld jdbcTemplateObject initialisiert. – dunni

Antwort

0

Sie haben in Ihrer App kein jdbcTemplate-Objekt erstellt, deshalb erhalten Sie NPE. Ich denke, es gibt zwei mögliche Optionen:

1) Fügen Sie jdbcTemplate Bean zum Federkontext hinzu und autowire es.

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

Und Ihre Klasse

@Service 
public class TwitterJDBCTemplate { 


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

2) Erstellen Sie jdbcTemplate in Ihrer Klasse

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 

Zusätzlich i bielive, dass es nicht die beste Praxis Methoden zu verwenden, mit großer Anzahl von params. Vielleicht solltest du deine benutzerdefinierte Klasse Twit oder Smth so erstellen.

0

Natürlich müssen Sie, bevor Sie eine JdbcTemplateBohne in Ihrem Anwendungskontext erstellen @autowire es in Ihrem Code.

Sie können es zum Beispiel in einer Klasse tun.

@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()); 
      } 

    } 

Nach this Tutorial. Durch Hinzufügen dieser Abhängigkeit wird das Erstellen der JdbcTemplate für die Anwendung erstellt.

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

Dann können Sie @autowire wie folgt

@Autowired 
private JdbcTemplate jdbcTemplate