Я работаю с 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;
}
Не могли бы вы помочь с этим, есть идеи?Спасибо