Я возвращаю свою модель с нулевым значением, потому что не знаю, как ждать завершения наблюдаемого - RxJava RestController - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю с RxJava и модифицирую, чтобы сделать вызов API и вернуть ответ.Проблема, которую я имею, состоит в том, что я получаю свою модель ModelToReturn с нулевыми значениями.В моем контроллере после этой строки:

//movieService.observe(movie).....

Программы продолжают выполнение, он выполняет эту строку:

// return Single.just(.....

И не ждет, пока наблюдаемое завершится.Вот причина получения нулей в моей модели.

Я думаю, что мне нужно поместить свой сервисный вызов внутрь возврата, примерно так:

return Single.just(movieService.observe(movie)....

, но не уверен, как это сделать.,

@RestController
public class ReactiveController {

    @Autowired
    private MovieService movieService;

    private MovieDetail movieDetail;

    @GetMapping(
            value = "/find/{movie}",
            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Single<ResponseEntity<ModelToReturn>> findMovie(@PathVariable String movie) {

        ModelToReturn modelToReturn = new ModelToReturn();


        movieService
                .observe(movie)
                .subscribe(new Observer<MovieDetail>() {
                    @Override
            public void onCompleted() {
                // At this point I can see the values correctly
                            modelToReturn.setAdult(movieDetail.isAdult());
                            modelToReturn.setBackdropPath(movieDetail.getBackdropPath());
                            modelToReturn.setOriginalLanguage(movieDetail.getOriginalLanguage());
                            modelToReturn.setOriginalTitle(movieDetail.getOriginalTitle());
                    }

                        @Override
                    public void onError(Throwable throwable) {

                        }

                        @Override
                        public void onNext(MovieDetail movieDetailInter) {
                            movieDetail = movieDetailInter;
                        }
                });

        return Single.just(
                ResponseEntity
                        .status(HttpStatus.OK)
                        .body(modelToReturn)
        );
    }
}

@Service
public class MovieServiceImpl implements MovieService<MovieDetail> {
        @Override
        public Observable<MovieDetail> observe(String movie) {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(API_ENDPOINT)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(createOkHttpClient())
                    .build();

            movieDetailServiceClientRetrofit = retrofit.create(MovieDetailServiceClientRetrofit.class);

            return movieDetailServiceClientRetrofit
                    .getMovieById(movie)
                    .subscribeOn(Schedulers.io())
                    .observeOn(Schedulers.computation())
                    .toObservable();
        }
}

public class ModelToReturn implements Serializable {

    private static final long serialVersionUID = -3515253168981789136L;

    private boolean adult;

    private String backdropPath;

    private String originalLanguage;

    private String originalTitle;

}


public class MovieDetail implements Serializable {

    @SerializedName("adult")
    private boolean adult;

    @SerializedName("backdrop_path")
    private String backdropPath;

    @SerializedName("original_language")
    private String originalLanguage;

    @SerializedName("original_title")
    private String originalTitle;

}

Не могли бы вы помочь с этим, есть идеи?Спасибо

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Это не сработало.Я использовал .toBlocking (), чтобы дождаться окончания наблюдаемого:

    Observable<MovieDetail> movieDetail = movieService.observe(movie);

    movieDetail.subscribe(new Observer<MovieDetail>() {.....


    return Single
            .just(
                    ResponseEntity
                            .status(HttpStatus.OK)
                            .body(movieDetail.toBlocking().single())
            );
0 голосов
/ 20 декабря 2018

Переместить ваш возврат внутрь блока onCompleted ():

public void onCompleted() {
// At this point I can see the values correctly
     modelToReturn.setAdult(movieDetail.isAdult());
     modelToReturn.setBackdropPath(movieDetail.getBackdropPath());
     modelToReturn.setOriginalLanguage(movieDetail.getOriginalLanguage());
     modelToReturn.setOriginalTitle(movieDetail.getOriginalTitle());

     return Single.just(ResponseEntity
                        .status(HttpStatus.OK)
                        .body(modelToReturn));
}
...