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.
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
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. –