2017-12-16 19 views
0

私はSpringベースのSpring MVCアプリケーションをFirebaseに接続しようとしています。Firebase ServiceAccount jsonリソースをSpring MVCで正しく読み込む方法は?

folder structure

問題がリソースをロードする方法、APIキーJSONファイルを配置する場所を私は知らないということで、メソッド呼び出しの正しい順序:私のアプリケーションのフォルダ構造は次のようになります。

リソースを次のようにロードしようとしました。これまで、ClassLoaderを使用してWEB-INFフォルダからロードしようとしましたが、コードが変更され、InputStreamのNullPointer Exception(なぜFileNotFound Exceptionですか?)を受け取り、以前の状態を復元できませんでした。

「Spring MVCの読み込みリソース」がどれくらいあってもリソースを読み込めないため、FileNotFound例外を受け取ります。サービスアカウントの「init」メソッドを使用してデバッガをチェックしたところ、 @PostConstructがサーバーの起動時に実行されていません。

私はリソースを読み込み、 "init"メソッドを呼び出して動作させることができるはずであることを理解しています。 (私は、Beanを作成した後、そしてfirebaseメソッドを使う前に一度呼び出すだけで十分だと思います)しかし、私は実際の実装を思いつくことができませんでした。

は、私はここからの例を使用: https://github.com/savicprvoslav/Spring-Boot-starter (ページの下)

私のコントローラクラス:

@Controller 
@RequestMapping("/firebase") 
public class FirebaseController { 

    @Autowired 
    private FirebaseService firebaseService; 

    @GetMapping(value="/upload/maincategories") 
    public void uploadMainRecordCategories() { 

     firebaseService.uploadMainRecordCategories(); 
    } 

私のサービスクラス:

@Service 
public class FirebaseServiceBean implements FirebaseService { 

    @Value("/api.json") 
    Resource apiKey; 

@Override 
public void uploadMainRecordCategories() { 
    // do something 
} 

    @PostConstruct 
    public void init() { 

     try (InputStream serviceAccount = apiKey.getInputStream()) { 

      FirebaseOptions options = new FirebaseOptions.Builder() 
        .setCredentials(GoogleCredentials.fromStream(serviceAccount)) 
        .setDatabaseUrl(FirebaseStringValue.DB_URL).build(); 

      FirebaseApp.initializeApp(options); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

答えて

0

どのように値を保存について@Value( "$ {firebase.apiKey}")を使用していますか?

あるいは、プロパティおよびリファレンスファイルへのパスを保存することを@value()内のapplication.propertiesにおいて

@Value("${service.account.path}") 
private String serviceAccountPath; 

service.account.path = /path/to/service-account.json 

次に設定コード:

private String getAccessToken() throws IOException { 
    GoogleCredential googleCredential = GoogleCredential 
      .fromStream(getServiceAccountInputStream()) 
      .createScoped(Collections.singletonList("https://www.googleapis.com/auth/firebase.messaging")); 
    googleCredential.refreshToken(); 
    return googleCredential.getAccessToken(); 
} 

private InputStream getServiceAccountInputStream() { 
    File file = new File(serviceAccountPath); 
    try { 
     return new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     throw new RuntimeException("Couldn't find service-account.json"); 
    } 
} 
関連する問題