Firebase能在Servlet上运行吗?

3

我正在尝试在一个通信于Google云平台的Servlet中使用Firebase Admin。我使用Servlet是因为我需要生成一个令牌来验证我对另一个API的访问权限。

有没有人成功地在Servlet上使用Firebase的历史?

我正在使用com.google.firebase:firebase-admin:5.2.0

App Engine SDK

com.google.appengine:appengine-java-sdk:1.9.50
com.google.appengine:appengine-api-1.0-sdk:1.9.54

在这个GET请求中,我正在使用令牌来访问商家API。

    String mToken = gateway.clientToken().generate();

    JSONObject jsonObject = new JSONObject();
    jsonObject.put("nonce", mToken);
    resp.getWriter().println(jsonObject.toString());

Firebase 管理员 POST 权限范围内。

所有的 Firebase 都在一个 try 块中,事务请求在另一个 try 块中。

 FileInputStream serviceAccount = new FileInputStream("/WEB-INF/...json");
 FirebaseOptions options = new FirebaseOptions.Builder()
         .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
         .setDatabaseUrl("https://MyProject.firebaseio.com/")
         .build();

 FirebaseApp.initializeApp(options);

IAM已经授予了读取权限。

使用事务的Firebase数据库引用

DatabaseReference ref = FirebaseDatabase
                .getInstance()
                .getReference("price");


ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
            String res = (String) dataSnapshot.getValue();
try {
        TransactionRequest request = new TransactionRequest()

                .amount(new BigDecimal(res)) //Res doesn't show any error but it also doesn't work
                .paymentMethodNonce(nonce)
                .options()
                .submitForSettlement(true)
                .storeInVaultOnSuccess(true)
                .done();


        Result<Transaction> result = gateway.transaction().sale(request);

谢谢。

{btsdaf} - Andrey Solera
{btsdaf} - Krutik
请问您能否准确地告诉我您想要做什么?我正在使用Google App Engine上的Firebase Admin。那么您遇到了什么问题? - Michael Meyer
@MichaelMeyer,我已经进行了编辑。我正在尝试使用价格值(res)并将其应用于交易请求的金额,但没有显示任何代码错误。Firebase和事务是异步线程。 - Marlhex
{btsdaf} - Marlhex
{btsdaf} - Marlhex
1个回答

1
Firebase Java Admin SDK通常在servlet中使用。您需要使用手动缩放实例部署到App Engine上。Firebase数据库客户端启动长时间运行的线程,因此无法在自动缩放的实例上操作(新的GAE java8运行时在这方面似乎更宽松,但我现在无法确认)。我建议您每个应用程序只调用一次FirebaseApp.initializeApp(),最好在ServletContextListener中。然后在您的servlet中,您应该能够像现在一样执行事务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接