前提・実現したいこと
Springを勉強中の初学者です。お世話になります。
Spring Bootを利用して、AWSEC2上に構築したMysqlにssh接続し、
データを取得して、コンソールに表示するプログラムを作っています。
SpringBoot自体の知識が乏しく、解決できないためこちらで質問させてください。
発生している問題・エラーメッセージ
参考にした記事によると、SpringBootではアプリケーションが起動する前にデータベースのコネクションを作成するらしく、先にポートフォワディングが必要とのことでした。
そのため、ポートフォワディングするために以下のように実装しましたが、
NullPointerExceptionが発生してしまいました。
該当のソースコード
java
1@SpringBootApprication 2public class DbConnectTest{ 3 public static void main(String[] args){ 4 DbConnectTest app = new DbConnectTest(); 5 app.connect(); 6 SpringApplication.run(DbConnectTest.class, args); 7 } 8 9 @Autowired 10 private JdbcTemplate jdbcTemplate; 11 12 public void connect(){ 13 Session session = null; 14 try{ 15 // SSH接続情報 16 String sshHost = "xx.xxx.xxx.xxx"; 17 int sshhPort = 22; 18 String sshUser = "user" 19 String sshPassword = ""; 20 21 // DBサーバー接続情報 22 String remoteHost = "xxx.xx.x.xxx"; 23 int localPort = 3306; 24 int remotePort = 3306; 25 26 final JSch jsch = new JSch(); 27 28 jsch.addIdentity = ("pemファイルのパス"); 29 30 session = jsch.getSession(sshUser, sshHost, sshhPort); 31 session.setPassword(sshPassword); 32 33 final Properties config = new Properties(); 34 config.put("StrictHostKeyChecking", "no"); 35 session.setConfig(config); 36 37 session.connect(); 38 session.setPortForwarding(localPort, remoteHost, remotePort); 39 40 if(jdbc == null){ 41 System.out.println("jdbc is null"); 42 } 43 44 List<Map<String, Object>> list = this.jdbc.queryForList("select * from table"); 45 list.forEach(System.out::println) 46 }catch(JSchException e){ 47 e.printStackTrace(); 48 }finally{ 49 session.disconnect(); 50 } 51 } 52}
Exception in thread "main" java.lang.NullPointerExceotion
.
デバッグしてみたところ、以下の部分でjdbcの中身がnullであるため落ちていました。
List<Map<String, Object>> list = this.jdbc.queryForList("select * from table");
いろいろ解決方法を探して、SpringBootでnewすると@Autowiredが無効になる旨が書いてある記事を見つけました。
ただ、newしないで実装しようとすると、connectメソッドがstaticでないため、呼び出すことができません。
(これは私自身のjavaの知識が無いことも原因の一つだと思っております。申し訳ありません)
試したこと
ssh接続するためにJSchをMavenに追加しました。
mysql-connectorをMavenに追加しました。
補足情報(FW/ツールのバージョンなど)
java8
SpringBoot2.3.0
以下の記事を参考に作りました。
JDBCでSSHトンネルを経由してMySQLに接続する方法
Spring Bootで踏み台をSSHで通して本来アクセスできないDBに接続する
どうすればやりたいことが実現できるのか、ご教示いただけますと幸いです。
長くなりましたが最後までお読みいただきありがとうございます。
よろしくお願いいたします。
7/15 追記
LOVE-KANON様
ご指摘、ご教示くださりありがとうございます。
ご指摘の内容も受け止め勉強に励みたいと思います。
私自身言葉足らずだったところがあるので訂正いたします。申し訳ありません。
参考にした記事の通りに実装した経緯があり説明が抜けておりました。
実際に実装したところ、以下のようなエラーが出てしまい今の状況になった次第です。
// 一部抜粋 [main] INFO org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor Initializing ExecutorService 'applicationTaskExecutor' [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... [main] ERROR com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Exception during pool initialization. com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) .. .. at jp.go.DbConnectTest.main(DbConnectTest.java:22) Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) .. .. at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:823) ... 48 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) .. .. at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) ... 51 more .. ..
こちらのエラーの解決方法として2つ目の参考にしたサイトの実装を追加したという状況です。
また、こちらのエラーの解決方法自体が見当違いでしたらご教示いただけますと助かります。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/07/15 18:32