2017-08-31 13 views
-2

私はJavaウォレットの生成コードを書きました。私は暗号化ウォレットを生成するためにこれを使用します。コードが提供されたエンティティがまだ発生している間に、POSTリクエスト後にNULLが返される

public synchronized WalletInfo generateAddress(GenerateWallet generateWallet) { 

     final WalletInfo walletInfo = new WalletInfo(); 

     String walletName = generateWallet.getWalletName(); 

     String currencyName = generateWallet.getCurrencyName(); 

     WalletInfo walletInfoDb = iWalletInfoDao.getWalletInfoWithWalletNameAndCurrency(walletName, currencyName); 

     if (walletInfoDb == null && genWalletMap.get(walletName) == null) { 

      String currency = currencyName.toUpperCase(); 

      if (currency.equals("BITCOIN")) { 

       final WalletManager walletManager = WalletManager.setupWallet(walletName); 

       walletManager.addWalletSetupCompletedListener((wallet) -> { 

        Address address = wallet.currentReceiveAddress(); 
        WalletInfo newWallet = createWalletInfo(walletName, currencyName, address.toString()); 

        // set the properties of the walletInfo 
        // the instance is final and can work inside the lambda expression 
        walletInfo.setId(newWallet.getId()); 
        walletInfo.setName(newWallet.getName()); 
        walletInfo.setAddress(newWallet.getAddress()); 
        walletInfo.setCurrency(newWallet.getCurrency()); 

        walletMangersMap.put(newWallet.getId(), walletManager); 
        genWalletMap.remove(walletName); 
       }); 

       genWalletMap.put(walletName, walletManager); 
       return walletInfo; 
      } else if (currency.equals("ETHEREUM")) { 
       return walletInfo; 
      } else { 
       return walletInfo; 
      } 
     } 

     return walletInfo; 
    } 

私はcURL

curl -H "Content-Type: application/json" -X POST -d '{"walletName": "Florence8","currencyName":"Bitcoin"}' http://localhost:8080/rest/wallet/generateAddress 

を使用してPOST要求を行うと、私はnullを取得するには、

{ 
    "id" : null, 
    "name" : null, 
    "address" : null, 
    "currency" : null 
} 

リターンですMySQLで永続化されました。

私はデバッグを続けており、これは配線されています。デバッグはコードのtop-to-bottomのシーケンスに従いません。デバッグのシーケンスは、コードはそれが必要この行walletManager.addWalletSetupCompletedListener((wallet)に来る場合、私は意味

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

、同様です内部で操作を実行しますか?

任意のsugesstionデータベースに正しく保持された後、どのようにエンティティを元に戻すことができますか?

+2

コードを[mcve]に切り落としてください。 –

+1

'walletInfo'を' final'にするのはどうですか? –

+2

'walletInfo'は最終的なものではないという上記の理由はありません。 '= new WalletInfo()'を削除して、次の行に上書きします。これを1行にまとめます。 'final WalletInfo walletInfo = iWalletInfoDao/* ...* /; 'また、' if(walletInfo == null) 'ブランチで' walletInfo'のメソッドを呼び出すことには意味がありません。これはNPEを投げることになります。 –

答えて

2

ラムダ式で使用する変数が

最終的または効果的に、最終的なあるべき問題は、変数を宣言した後に値を再割り当てしているということである - 実際には、最初の割り当てが重複している、ので、値を使用せずに上書きするだけです。 -

だから、最初の割り当て除去することにより、効果的にfinalそれを作る:

WalletInfo walletInfo = iWalletInfoDao.getWalletInfoWithWalletNameAndCurrency(walletName, currencyName); 

を実際にfinal

final WalletInfo walletInfo = iWalletInfoDao.get/*etc*/ 
さらに

、この条件:

if (walletInfo == null) { 

は反転されています。ブロック内では、walletInfoのメソッドを呼び出します。 walletInfoがヌルであるため、コールはNullPointerExceptionで失敗します。

+2

おそらく、彼は 'if(walletInfo == null)... walletInfo.setName(walletName); 'を使っていることに気付くでしょう。 – Nathan

+0

私は両方が正しいことを確認します。確かに、私は質問を変更しました。もう一度見たいですか? Btw、私は新しいインスタンスを作成して、 'NullPointerException' – Arefe

関連する問題