2016-05-02 4 views
0

Ich habe jetzt eine einfache Dropwizard-API mit einem Endpunkt, um alle Benutzer in meiner AWS RDS-Datenbank zurückzugeben, und einem "Hallo Welt" -Endpunkt. Ich kann auf meinem Dev-Rechner eine Verbindung zu meiner RDS-Instanz mit MySQL Workbench herstellen, daher weiß ich, dass die Verbindung erlaubt ist.Warum kann ich keine Verbindung mit AWS RDS-Instanz mit Dropwizard herstellen?

Meine App baut und anfänglich läuft gut. Ich habe einen „Hallo Welt“ Endpunkt, das funktioniert, aber wenn ich versuche, und schlage meinen /users/all Endpunkt, erhalte ich folgende Fehlermeldung:

ERROR [2016-05-01 23:47:07,305] io.dropwizard.jersey.errors.LoggingExceptionMapper: Error handling a request: b92c1a9ace3378bf 
! java.sql.SQLException: No database selected 
! at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074) 
! at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096) 
! at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028) 
! at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490) 
! at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651) 
! at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734) 
! at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) 
! at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379) 
! at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1327) 
! ... 66 common frames omitted 

Ich glaube, ich bin mit der 1.0.0-rc3-SNAPSHOT Dropwizard Version von Sonatype Nexus Snapshots.

In meinem config.yml, ich habe:

database: 
    driverClass: com.mysql.jdbc.Driver 
    user: <my_user> 
    password: <my_password> 
    url: jdbc:mysql://<my_db>.blah.rds.amazonaws.com 

Meine Konfiguration Klasse ist sehr einfach, und ist beschränkt auf die folgenden.

public class AppConfiguration extends Configuration { 

    @Valid 
    @NotNull 
    private DataSourceFactory database = new DataSourceFactory(); 

    @JsonProperty("database") 
    public DataSourceFactory getDataSourceFactory() { 
     return database; 
    } 

} 

und mein Service run-Methode sieht wie folgt aus:

@Override 
public void run(AppConfiguration configuration, Environment environment) { 

    environment.jersey().register(RolesAllowedDynamicFeature.class); 
    environment.jersey().register(new AppResource()); 

    /* initialize DB and DAOs */ 
    final DBIFactory factory = new DBIFactory(); 
    final DBI jdbi = factory.build(environment, configuration.getDataSourceFactory(), "mysql"); 

    final UserDAO userDAO = jdbi.onDemand(UserDAO.class); 

    /* Initialize Resources */ 
    final UserResource userResource = new UserResource(userDAO); 
    environment.jersey().register(userResource); 

} 

ich Debuggen der Anwendung versucht haben, beim Laufen, und sehen, dass mein userDAO Objekt erstellt wurde. Ich habe versucht, die Instanzvariablen/Funktionen zu untersuchen, konnte aber keine nützlichen Informationen finden, die erklären, warum sie nicht verbunden war.

Antwort

2

Sie geben in der JDBC-URL keine korrekte Datenbank an. Sehen Sie sich das Format an here: jdbc:mysql://[host1][:port1][,[host2][:port2]]...[/[database]]

+0

Es sieht für mich so aus, als ob der einzige Unterschied ist, dass ich keine Port-Nummer gebe. Dafür verwende ich den Standard-Port, so dass es keine Rolle spielen sollte. Ich werde das später versuchen, nur um sicherzugehen, aber war das, was du dachtest, nicht richtig? – mdw7326

+1

Die Fehlermeldung besagt ausdrücklich, dass Sie keine Datenbank angegeben haben. Wenn Sie sich die JDBC-URL-Syntax ansehen, geben Sie die Datenbank nach dem Host an, wie folgt: 'jdbc: mysql: // host: port/database' Ihre JDBC-URL enthält den'/database'-Teil. –

Verwandte Themen