Java Spring - return from asynchronous callback?

Working with the backend with Spring (Java) and Firebase. We use Firebase tokens (added as an authentication header) to identify the user using the built-in UID .

Unfortunately, retrieving this UID from the token must be done asynchronously, so I can only get the token from the callback onSuccess. To answer this question, I have to return the object from the method below deleteUser, however I cannot know what the answer will be until I get a success / failure callback!

I can imagine a way to do this, expecting a flag that sets my callback, or with some messy time, but I wonder if there is a clean way to handle this without introducing race conditions or a lot of extra code. Can anyone help?

Display requests (processes the request, responds to requests)

    @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);
    }
+4
source share
1 answer

Although there are ways to block the thread until the asynchronous request completes, there is a simpler and more resource-saving solution since Spring 3.2.

DeferredResult<T> , . 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;
}
+6

Source: https://habr.com/ru/post/1660820/


All Articles