Написать бизнес-логику с реактивной базой данных - PullRequest
0 голосов
/ 11 сентября 2018

Я пишу реактивный API, который отправляет уведомления на телефоны Android. Процесс отправки уведомления должен получить доступ к коду токена с телефона, чтобы отправить ему сообщение .Для этого я создал конечную точку на стороне сервера для получения токена с телефона.Моя проблема - сохранить токен и затем использовать его в процессе, описанном выше.Это TokenController, TokenService, TokenRepository и Token POJO:

@RestController
@RequestMapping("/api")
public class TokenController {

    @Autowired
    private TokenService tokenService;

    @CrossOrigin
    @RequestMapping(value = "/token",
            method = RequestMethod.POST,
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody ResponseEntity<?> newToken(@RequestBody Token token) {
        return ResponseEntity.ok(tokenService.save(token));
    }
} 

//--------------------------------------------------------------- 

@Service
public class TokenServiceImpl implements TokenService {

    @Autowired
    private TokenRepository tokenRepository;

    @Override
    public Mono<Token> save(Token token) {
        return tokenRepository.save(token);
    }
}

//--------------------------------------------------------------- 

@Repository
public interface TokenRepository extends ReactiveCrudRepository<Token, Long> { }

//---------------------------------------------------------------

@Data
@Document(collection = "token")
public class Token {

    @Id
    private Long _id;

    private Long clientCode;

    private String tokenKey; // VALUE THAT IS NEEDED ON NOTIFICATION
} 

Чтобы отправить уведомление, у меня есть контроллер уведомлений, которому требуется доступ к базе данных и поиск токена.Чтение реактивного подхода Я не мог понять, как читать базу данных, используя TokenRepository внутри моей службы уведомлений, и использовать что-то вроде метода «findById» для получения токена.Как я могу использовать возвращенный объект Mono и получить свойство "tokenKey"?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вместо ResponseEntity<Mono<Token>> у вас должно быть Mono<ResponseEntity<Token>> попробуйте это

 public @ResponseBody Mono<ResponseEntity<Token>> newToken(@RequestBody Token token) {
        return tokenService.save(token)
               .map(t -> ResponseEntity.ok(t));
    }

Вы заключаете моно в объект, на который нет подписки, так что поменяйте местами.

0 голосов
/ 12 сентября 2018

Я обнаружил, что могу сохранить будущий результат в CompletableFuture, а затем, когда он завершится, сохранить объект Token.Вот пример этого:

CompletableFuture<Token> tokenFuture = tokenRepository.findByClientCode(notificationRequest.getClientCode()).toFuture();

Token token = tokenFuture.get(5, TimeUnit.SECONDS);

Он ждет 5 секунд или бросает TimeoutException

...