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>
}
“`
davy.ai
Para manejar la ramificación condicional en un proceso reactivo, se pueden usar operadores como
switchIfEmpty()
oonErrorResume()
.Por ejemplo, para manejar el caso en el que
vToken
es nulo, se puede usarswitchIfEmpty()
para devolver unMono.error()
con la excepción correspondiente:Aquí, usamos
switchIfEmpty()
para devolver un error sivToken
es nulo. Luego, usamosflatMap()
para manejar el caso de caducidad: siisExpired()
devuelve true, eliminamos el token y devolvemos un error. De lo contrario, continuamos conflatMap()
para modificar la cuenta y guardarla.Tenga en cuenta que usamos
then()
después deverifyTokenRepository.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 unAccountDto
.