es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mapear las declaraciones condiciones imperativas (con lanzamiento de excepciones) al proceso Reactivo.

Estoy teniendo dificultades para comprender el flujo del proceso Reactivo. Mi entendimiento es que, al manipular datos dentro de un Mono o Flux, se debe mantener la consistencia del tipo de datos. Sin embargo, cuando ocurren problemas dentro de ese proceso, algo similar a una excepción debe ser lanzada, lo cual rompe la consistencia del tipo de datos.

Actualmente, tengo un proceso imperativo para tomar un ID de token de verificación y procesarlo. En dos casos, se lanzan excepciones (InvalidTokenException es una respuesta 404; ExpiredTokenException es una respuesta 410), y en el último se modifica y guarda la cuenta, y se elimina el token. Me gustaría convertir esto en un proceso reactivo:

public AccountDto verifyAccountByToken (UUID tokenId) {
    VerifyToken vToken = verifyTokenRepository.findByToken(tokenId);
    if (vToken == null) {
        throw new InvalidTokenException();
    }
    if (vToken.isExpired()) {
        verifyTokenRepository.delete(vToken);
        throw new ExpiredTokenException();
    }
    Account account = vToken.getAccount();
    account.addRole(AccountRole.VERIFIED);
    account.deleteRole(AccountRole.UNVERIFIED);
    accountRepository.save(account);
    verifyTokenRepository.delete(vToken);
    return new AccountDto(account);
}

Creo que lo siguiente es esencialmente correcto para el proceso de manipulación de datos cuando todo está como debería ser, pero ¿cómo manejo la ramificación condicional? – ¿Cómo digo: haz esto si está vacío? (supongo que puedo usar .filter() como una forma de capturar el caso de vencimiento). ¿Y cómo lo convierto en un tipo de error?

“`java
public Mono<accountdto> verifyAccountByToken (UUID tokenId) {
return verifyTokenRepository.findByToken(tokenId)

<pre><code> // las partes que no puedo resolver para lidiar con los tokens no válidos y vencidos

.flatMap(vToken -> {
verifyTokenRepository.delete(vToken);
return vToken.getAccount();
})
.flatMap(account -> {
account.addRole(AccountRole.VERIFIED);
account.deleteRole(AccountRole.UNVERIFIED);
return accountRepository.save(account);
})
.map(account -> new AccountDto(account));
</code></pre>

}
“`

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para manejar la ramificación condicional en un proceso reactivo, se pueden usar operadores como switchIfEmpty() o onErrorResume().

    Por ejemplo, para manejar el caso en el que vToken es nulo, se puede usar switchIfEmpty() para devolver un Mono.error() con la excepción correspondiente:

    public Mono<accountdto> verifyAccountByToken (UUID tokenId) {
        return verifyTokenRepository.findByToken(tokenId)
                .switchIfEmpty(Mono.error(new InvalidTokenException()))
                .flatMap(vToken -> {
                    if (vToken.isExpired()) {
                        return verifyTokenRepository.delete(vToken)
                                .then(Mono.error(new ExpiredTokenException()));
                    } else {
                        return Mono.just(vToken);
                    }
                })
                .flatMap(vToken -> {
                    Account account = vToken.getAccount();
                    account.addRole(AccountRole.VERIFIED);
                    account.deleteRole(AccountRole.UNVERIFIED);
                    return accountRepository.save(account);
                })
                .map(AccountDto::new);
    }
    

    Aquí, usamos switchIfEmpty() para devolver un error si vToken es nulo. Luego, usamos flatMap() para manejar el caso de caducidad: si isExpired() devuelve true, eliminamos el token y devolvemos un error. De lo contrario, continuamos con flatMap() para modificar la cuenta y guardarla.

    Tenga en cuenta que usamos then() después de verifyTokenRepository.delete(vToken) para descartar el resultado de esa operación y continuar con el siguiente paso en la cadena.

    También tenga en cuenta que usamos referencias a métodos (AccountDto::new) y notación lambda (Mono.just(vToken)) para simplificar el código.

    Con estos cambios, el método completo ahora devuelve un Mono<accountdto> en lugar de un AccountDto.

Comments are closed.