hat Ich versuche, REST-API zu erstellen, um Schreibvorgänge mit Firebase Server SDK und Jersey durchzuführen. HierWie Respone von Jersey REST API-Methode, die Listern innerhalb
ist das, was ich zu tun versucht:
- Initializing Firebase SDK
- Getting idToken from Client and Validating idToken
- Performing einige Schreibvorgänge auf wenige Firebase Knoten
- Senden api Antwort
Ich möchte return Antwort nur, wenn der Firebase-Schreibvorgang erfolgreich ist oder fehlschlägt. Das passiert innerhalb von Firebase Listeners. Ich versuche jedoch, Wert von Listeners zurückzugeben, ich erhalte Fehler, weil Firebase-Listener void Rückgabetyp haben.
Wie kann ich Antwort vom Zuhörer zurückgeben?
Hier ist mein Code.
MyEndpoint.java
@Path("/restapi")
//BaseEndpoint does Authentication operations
public class MyEndpoint extends BaseEndpoint {
public void Authenticate(String token, AuthenticationListener authenticationResultListener) {
super.Authenticate(token, authenticationResultListener);
}
@POST
@Produces("application/json")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createCommunity(@FormParam("idToken") String idToken) {
Authenticate(idToken, new AuthenticationListener() {
@Override
public void onAuthenticationSuccess() {
// The app only has access as defined in the Security Rules
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/mysamplenode");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
String res = dataSnapshot.getKey();
//I will do some write operations on Firebase here
//If they complete successfuly only then I want to return api response
return Response.status(200).entity().build();
}
@Override
public void onCancelled(DatabaseError arg0) {
System.out.println("DatabaseError-------------" + arg0);
return Response.status(500).entity("DatabaseError").build();
}
});
}
@Override
public void onAuthenticationFailure() {
return Response.status(403).entity("Forbidden").build();
}
});
}
}
BaseEndpoint.java
public class BaseEndpoint {
public static String uid;
public void Authenticate(String token, AuthenticationListener authenticationResultListener) {
// idToken comes from the client app
FirebaseAuth.getInstance().verifyIdToken(token).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception arg0) {
System.out.println("Uid exp= " + arg0);
authenticationResultListener.onAuthenticationFailure();
}
}).addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
@Override
public void onSuccess(FirebaseToken decodedToken) {
uid = decodedToken.getUid();
System.out.println("Uid= " + uid);
authenticationResultListener.onAuthenticationSuccess();
}
});
}
}
Vielen Dank. Das sieht vielversprechend aus, ich verwende folgende Abhängigkeit. Was muss ich ändern, um Jersey zu benutzen? 2.X? ' \t \t \t com.sun.jersey \t \t \t Jersey-Server \t \t \t 1,9 \t \t ' –
Es ist nicht so einfach wie nur wechselnde Abhängigkeiten. Sie benötigen noch eine Konfiguration. Wenn Sie keine Erfahrung mit Jersey 2 haben, sollten Sie diese [Erste Schritte Leitfaden] (http://paulsamtha.blogspot.com/2015/10/getting-started-with-jersey-2.html) –
Ich habe Setup Jersey2.23.1 jetzt. Aber ich bekomme einen Fehler für Async-Anruf.Hier ist der Fehler 'WARNUNG: Der Versuch, die Servlet-Anfrage in den asynchronen Modus zu stellen, ist fehlgeschlagen. Bitte überprüfen Sie Ihre Servlet-Konfiguration - alle Servlet-Instanzen und Servlet-Filter, die an der Anfrageverarbeitung beteiligt sind, müssen die Unterstützung für die asynchrone Anfrage explizit deklarieren. java.lang.IllegalStateException: Ein Filter oder Servlet der aktuellen Kette unterstützt keine asynchronen Operationen. " Haben viel Zeit damit verbracht, die Lösung zu finden, keiner von ihnen hat funktioniert. –