Администратор JavaEE и Firebase SDK - setValueAsyn c не отправляет данные в базу данных в реальном времени - PullRequest
0 голосов
/ 05 апреля 2020

Я использую Firebase Admin SDK и JavaEE на Intellij, построенном на Gradle и сервере Glassfi sh.

Я пытаюсь получить sh значение для базы данных в реальном времени, но, к сожалению, не могу этого сделать. Я искал онлайн уже несколько недель и ничего не получил. Я также следовал за некоторыми решениями в ответах stackoverflow, таких как: Firebase Java Admin SDK не работает , но у меня ничего не работает.

Я прочитал много причин, почему такая проблема будет происходить с Firebase Admin SDK, но у меня нет решений.

вот мой код:

образец пакета;

package sample;

import com.google.api.core.ApiFuture;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseToken;
import com.google.firebase.auth.UserRecord;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import sample.model.FireBaseAuth;
import sample.model.FireBaseUtils;
import sample.model.Owner;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

@WebServlet("/success")
public class SuccessServlet extends HttpServlet {

    public void init() throws ServletException {
        super.init();
        FireBaseUtils.initilizeFirebase();
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        String email = request.getParameter("email");
        String password  = request.getParameter("pass");

        //System.out.println(name);

        try{
            //a hashmap for the number of shopsOwned
            HashMap<String, String> shopsOwned = new HashMap<>();
            shopsOwned.put("shopName" , "shopName");

            //get the database instance and the database reference
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference ref = database.getReference("Business");

            DatabaseReference ownersRef = ref.child("Owners"); //further get the reference to the owners node

            //create a new owner with the values of the new user, using the Owner class
            Owner newOwner = new Owner("userRecord2.getUid()", "userRecord2.getDisplayName()",
                    "userRecord2.getPhoneNumber()", "userRecord2.getEmail()", shopsOwned);

            //create a hashmap of the users, in this case, just one user
            Map<String, Owner> users = new HashMap<>();
            users.put("userRecord2getPhoneNumber", newOwner); //add the new owner to the hashmap

            System.out.println("this is the user :" + newOwner.getFull_name());

            //push the new owner hashmap to the database reference
            ApiFuture<Void> future = ownersRef.push().setValueAsync(users);

            //Object o = future.get(8, TimeUnit.SECONDS);
            System.out.println(future.isDone());
            //System.out.println(future.isDone());

            request.getRequestDispatcher("success.jsp").forward(request, response);

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



    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        doGet(request, response);

    }

}

любые идеи будут оценены.

Редактировать: я не получаю никаких ошибок, веб-приложение работает нормально, но база данных реального времени на firebase не обновляется

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Вам нужно дождаться завершения будущего, прежде чем поток запроса будет возвращен. В противном случае нет гарантии, что обновление будет завершено, а любые ошибки будут скрыты. Попробуйте что-то вроде следующего:

ApiFuture<Void> future = ownersRef.push().setValueAsync(users);
future.get();
request.getRequestDispatcher("success.jsp").forward(request, response);
0 голосов
/ 05 апреля 2020

Запись в Firestore (например, взаимодействие с большинством облачных API) происходит асинхронно и в другом потоке. Когда вы вызываете future.isDone(), операция еще не завершена.

Вы захотите добавить обратный вызов, который будет вызван после завершения операции:

ApiFuture<Void> future = ownersRef.push().setValueAsync(users);
future.addCallback(future, new ApiFutureCallback<String>() {
    @Override
    public void onSuccess(String result) {
      System.out.println("Operation completed with result: " + result);
      System.out.println(future.isDone());
      request.getRequestDispatcher("success.jsp").forward(request, response);
    }

    @Override
    public void onFailure(Throwable t) {
      System.err.println("Operation failed with error: " + t);
    }

Также см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...