Próbuję użyć retrofit2 z Observables i Lombok dla moich modeli, aby uzyskać token dla interfejsu API spotify. Próbowałem z listonoszem i działało poprawnie, ale mam problemy z Javą. Mam te 3 klasy:

AuthorizationServiceCommandImpl.java

import com.service.userservice.feature.authorization.backend.model.Token;
import lombok.NonNull;
import okhttp3.OkHttpClient;
import org.springframework.stereotype.Service;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Single;
import rx.schedulers.Schedulers;

@Service
public class AuthorizationServiceCommandImpl implements AuthorizationServiceCommand {


    private AuthorizationService authorizationService;

    private static OkHttpClient createOkHttpClient() {
        final OkHttpClient.Builder httpClient =
                new OkHttpClient.Builder();
        return httpClient.build()
    }

    public void getToken(String code) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://accounts.spotify.com/api/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(createOkHttpClient())
                .build();

        authorizationService = retrofit.create(AuthorizationService.class);

        // At this point all these attributes have a value, I used System.out.println to confirm:
        // clientId, clientSecret, grantType, code, redirectUri

        authorizationService
                .getToken(clientId, clientSecret, grantType, code, redirectUri)
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.computation())
                .map(token-> token.toString());
    }
}

AuthorizationService.java

import com.service.userservice.feature.authorization.backend.model.Token;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
import rx.Single;

public interface AuthorizationService {

    @FormUrlEncoded
    @POST("token")
    Single<Token> getToken(@Field("client_id") String clientId,
                        @Field("client_secret") String clientSecret,
                        @Field("grant_type") String grantType,
                        @Field("code") String code,
                        @Field("redirect_uri") String redirectUri);

}

Mój model, Token.java

import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@SuppressWarnings("PMD.UnusedPrivateField")
public class Token {

    @SerializedName("access_token")
    private String accessToken;

    @SerializedName("token_type")
    private String tokenType;

    @SerializedName("expires_in")
    private String expiresIn;

    @SerializedName("refresh_token")
    private String refreshToken;

    @SerializedName("scope")
    private String scope;

    @SerializedName("error_description")
    private String errorDescription;

    @SerializedName("error")
    private String error;

    @Override
    public String toString() {
        System.out.println("Token{" +
            "accessToken='" + accessToken + '\'' +
            ", tokenType='" + tokenType + '\'' +
            ", expiresIn='" + expiresIn + '\'' +
            ", refreshToken='" + refreshToken + '\'' +
            ", scope='" + scope + '\'' +
            ", errorDescription='" + errorDescription + '\'' +
            ", error='" + error + '\'' +
            '}');
        return "Token{" +
            "accessToken='" + accessToken + '\'' +
            ", tokenType='" + tokenType + '\'' +
            ", expiresIn='" + expiresIn + '\'' +
            ", refreshToken='" + refreshToken + '\'' +
            ", scope='" + scope + '\'' +
            ", errorDescription='" + errorDescription + '\'' +
            ", error='" + error + '\'' +
            '}';
    }
}

Ta linia nie pokazuje niczego:

.map(token-> token.toString());

To tak, jakby połączenie nigdy nie zostało wykonane. Nie jestem pewien, jak mogę potwierdzić, że połączenie zostało wykonane, a także próbowałem usunąć te 2 linie Observables

.subscribeOn(Harmonogramy.io()) .observeOn(Harmonogramy.computation())

I wróć

Single<Token> getToken(@Field("client_id") String clientId,

Ale nie działało. Dowolny pomysł? Z góry dziękuję

0
David 23 listopad 2018, 22:21

1 odpowiedź

Najlepsza odpowiedź

Kod:

.map(token->token.toString());

Robi coś: zwraca zmodyfikowany obserwowalny. Jednak zmodyfikowany obserwowalny jest następnie wyrzucany. Aby móc go aktywować, należy subskrybować obserwowalny.

Możliwe, że ujdzie ci to na sucho z dodaniem operatora na końcu:

.map(token->token.toString())
.subscriber();

Jednak nie jest jasne, co chcesz zrobić z zamapowanym ciągiem.

0
Bob Dalgleish 24 listopad 2018, 00:49