2017-12-16 8 views
0

Ich versuche, meine Spring MVC (nicht Spring Boot) Anwendung mit Firebase zu verbinden. Meine Anwendung Ordnerstruktur sieht wie folgt aus:Wie Sie die Firebase ServiceAccount-JSON-Ressource mit Spring MVC korrekt laden?

folder structure

Das Problem ist, dass ich weiß nicht, wo die api Schlüssel JSON-Datei zu platzieren, wie die Ressource zu laden, und die korrekte Reihenfolge der Methodenaufrufe.

Ich habe versucht, die Ressource wie unten gezeigt zu laden. Vorher habe ich auch versucht mit ClassLoader es aus dem WEB-INF-Ordner zu laden und es funktionierte, aber änderte den Code und erhielt weiterhin NullPointer Exception (warum nicht FileNotFound Exception?) Für den InputStream und konnte den vorherigen Zustand nicht wiederherstellen.

Mit dem aktuellen Zustand empfange ich weiterhin FileNotFound Exception, da ich nicht in der Lage bin, die Ressource zu laden, egal wie viel ich "Spring MVC load resource" googelte und wie ich die "init" -Methode des Dienstkontos mit überprüft @PostConstruct läuft nicht beim Starten des Servers.

Ich verstehe, dass ich in der Lage sein sollte, die Ressource zu laden und die "init" -Methode aufzurufen, damit es funktioniert. (Ich nehme an, es ist genug, um es einmal nach dem Erstellen der Bean und vor der Verwendung von Firebase-Methoden zu nennen) Aber ich konnte einfach nicht mit einer funktionierenden Implementierung kommen.

habe ich Beispiele von hier: https://github.com/savicprvoslav/Spring-Boot-starter (Ende der Seite)

Mein Controller-Klasse:

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

    @Autowired 
    private FirebaseService firebaseService; 

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

     firebaseService.uploadMainRecordCategories(); 
    } 

Mein Service Klasse:

@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(); 
     } 
    } 
} 

Antwort

0

wie etwa Wert Speichern in eine Sprungeigenschaft und @Value ("$ {firebase.apiKey}") verwenden?

Alternativ speichert Pfad in Eigentum und Verweise auf Datei, die in @Value()

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

In application.properties:

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

dann Config-Code:

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"); 
    } 
}