gpt4 book ai didi

Java Spring - 从异步回调返回?

转载 作者:搜寻专家 更新时间:2023-11-01 02:03:09 25 4
gpt4 key购买 nike

使用 Spring (Java) 和 Firebase 在后端工作。我们使用 Firebase token (附加为身份验证 header )来识别用户,使用 built in UID .

不幸的是,从 token 中提取这个 UID 必须异步完成,所以我只能从 onSuccess 回调中获取 token 。要提供响应,我必须从下面的 deleteUser 方法返回一个对象,但是在获得成功/失败回调之前我无法知道响应是什么!

我可以想象一种通过等待设置我的回调的标志或一些困惑的时间来实现这一点的方法,但我想知道是否有一种干净的方法来处理这个问题而不引入竞争条件或大量额外的代码。谁能帮忙?

请求映射(处理请求,服务响应)

    @RequestMapping(value = "/users", method = RequestMethod.DELETE)
public @ResponseBody String deleteUser(@RequestHeader("Authentication") String token) {
FirebaseUtil.getUid(token, new OnSuccessListener<FirebaseToken>() {
@Override
public void onSuccess(FirebaseToken decodedToken) {
String uid = decodedToken.getUid();
//RETURN SUCCESSFUL HERE
}
}, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//RETURN FAILURE HERE
}
});

//MUST RETURN SOMETHING HERE?
User userToDelete = userDao.get(uid); //DONT HAVE THE uid HERE
userDao.delete(uid);
clearUserAccounts(userToDelete);
return uid + " was deleted";
}

FirebaseUtil.getUid()

public static void getUid(String token, OnSuccessListener<FirebaseToken> successListener, OnFailureListener failureListener) {
FirebaseAuth.getInstance()
.verifyIdToken(token)
.addOnSuccessListener(successListener)
.addOnFailureListener(failureListener);
}

最佳答案

虽然有一些方法可以阻塞线程直到异步请求完成,但自 Spring 3.2 以来有一个简单且更节省资源的解决方案。

您可以使用 DeferredResult<T>作为启用异步处理的返回类型。这允许 servlet 容器立即重用 HTTP 工作线程,同时让您免于强制序列化异步请求链的麻烦。

通过填写注释,您的代码将如下所示:

@RequestMapping(value = "/users", method = RequestMethod.DELETE)
public DeferredResult<String> deleteUser(@RequestHeader("Authentication") String token) {
final DeferredResult<String> result = new DeferredResult<>();

FirebaseUtil.getUid(token, new OnSuccessListener<FirebaseToken>() {
@Override
public void onSuccess(FirebaseToken decodedToken) {
String uid = decodedToken.getUid();
User userToDelete = userDao.get(uid);
userDao.delete(uid);
clearUserAccounts(userToDelete);
result.setResult(uid + " was deleted");
}
}, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
result.setErrorResult(e);
}
});

return result;
}

关于Java Spring - 从异步回调返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40615356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com