我正在使用Spring(Java)和Firebase开发后端。我们使用Firebase令牌(作为身份验证标头附加)来识别用户,使用内置UID (链接1)。
不幸的是,从令牌中提取此UID必须异步完成,因此我只能从onSuccess
回调中获取令牌。
为了提供响应,我必须从下面的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);
}
call()
?它们会起作用吗?如果不行,为什么?http://xpadro.blogspot.ca/2015/07/understanding-callable-and-spring.html - David Ferris