2015-10-24 3 views
1

Im работает в Json конверсии странная проблема, у меня есть japps на основе japps, реализующий аутентификацию oauth, и простое приложение для Android; Я основывал мою программирует логику на этот посту jhipster oauth : How can i get the access_token via CURLRetrofit 1.9, чтобы потреблять jhipster oauth ответ не заполнен

для андроид приложения у меня есть этот код:

public class RestAdapterManager { 

    public static final String API_BASE_URL = "http://192.168.0.102:8080/"; 

    private static RestAdapter.Builder builder = new RestAdapter.Builder() 
      .setEndpoint(API_BASE_URL); 
      //.setClient(new OkClient(new OkHttpClient())); 

    public static <S> S createService(Class<S> serviceClass) { 
     return createService(serviceClass, null, null); 
    } 

    public static <S> S createService(Class<S> serviceClass, String username, String password) { 
     if (username != null && password != null) { 
      // concatenate username and password with colon for authentication 
      String credentials = username + ":" + password; 
      // create Base64 encodet string 
      final String basic = 
        "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); 

      builder.setRequestInterceptor(new RequestInterceptor() { 
       @Override 
       public void intercept(RequestFacade request) { 
        request.addHeader("Accept", "applicaton/json"); 
        request.addHeader("Authorization", basic); 
       } 
      }); 
     } 

     RestAdapter adapter = builder.setLogLevel(RestAdapter.LogLevel.FULL).build(); 
     return adapter.create(serviceClass); 
    } 
} 

Интерфейс потреблять службы OAuth самого

public class AuthorizeService { 

    private static IAuthorizeService authorizeService; 

    public static IAuthorizeService getAuthorizeService() { 
     return RestAdapterManager.createService(IAuthorizeService.class, "RikuyWebapp", "mySecretOAuthSecret"); 
    } 

    /**/ 

    public interface IAuthorizeService { 

     @POST("/oauth/token") 
     public void authorize(@Body Object dummy, @Query("username") String userName, 
           @Query("password") String password, 
           @Query("grant_type") String grantType, 
           @Query("scope") String scope, 
           @Query("client_id") String client_id, 
           @Query("client_secret") String client_secret, 
           Callback<UserToken> callback); 
    } 
} 

и фактический вызов на услуги:

Button loginButton = (Button) findViewById(R.id.loginbutton); 
     loginButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       AuthorizeService.getAuthorizeService().authorize("", "username", 
         "password", "password", "read", "appId", "appSecret", new Callback<UserToken>() { 
          @Override 
          public void success(UserToken result, Response response) { 
           Log.d("sucees!", result.getAccessToken()); 
          } 

          @Override 
          public void failure(RetrofitError error) { 
           Log.d("Fail!", error.getBody().toString()); 
          } 
         }); 

      } 
     }); 

Я пытаюсь поймать ответ, используя этот объект ген оцениваются с помощью http://www.jsonschema2pojo.org/ и ответ я получил от завитка

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
     "access_token", 
     "token_type", 
     "refresh_token", 
     "expires_in", 
     "scope" 
}) 
public class UserToken { 

    @JsonProperty("access_token") 
    private String accessToken; 
    @JsonProperty("token_type") 
    private String tokenType; 
    @JsonProperty("refresh_token") 
    private String refreshToken; 
    @JsonProperty("expires_in") 
    private long expiresIn; 
    @JsonProperty("scope") 
    private String scope; 
    @JsonIgnore 
    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

    /** 
    * 
    * @return 
    * The accessToken 
    */ 
    @JsonProperty("access_token") 
    public String getAccessToken() { 
     return accessToken; 
    } 
.......... 

Из журнала модифицированной everithing seamns будет хорошо:

10-24 10:54:44.365 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ ---> HTTP POST http://192.168.0.102:8080/oauth/token?username=username&password=password&grant_type=password&scope=read&client_id=webappId&client_secret=webAppSecret 
10-24 10:54:44.365 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Authorization: Basic UmlrdXlXZWJhcHA6bXlTZWNyZXRPQXV0aFNlY3JldA== 
10-24 10:54:44.365 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Content-Type: application/json; charset=UTF-8 
10-24 10:54:44.365 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Content-Length: 2 
10-24 10:54:44.368 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ "" 
10-24 10:54:44.368 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ ---> END HTTP (2-byte body) 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ <--- HTTP 200 http://192.168.0.102:8080/oauth/token?username=username&password=password&grant_type=password&scope=read&client_id=webappId&client_secret=webAppSecret (208ms) 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Server: Apache-Coyote/1.1 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ X-Content-Type-Options: nosniff 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ X-XSS-Protection: 1; mode=block 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Pragma: no-cache 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Expires: 0 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ X-Frame-Options: DENY 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ X-Application-Context: application:dev:8080 
10-24 10:54:44.576 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Cache-Control: no-store 
10-24 10:54:44.577 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Pragma: no-cache 
10-24 10:54:44.577 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Content-Type: application/json;charset=UTF-8 
10-24 10:54:44.577 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Transfer-Encoding: chunked 
10-24 10:54:44.577 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ Date: Sat, 24 Oct 2015 15:54:44 GMT 
10-24 10:54:44.577 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ OkHttp-Selected-Protocol: http/1.1 
10-24 10:54:44.577 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ OkHttp-Sent-Millis: 1445702084460 
10-24 10:54:44.577 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ OkHttp-Received-Millis: 1445702084573 
10-24 10:54:44.578 29537-29815/mobile.rikuy.com.co.androidoauthclient D/Retrofit﹕ {"access_token":"26eb7fa0-16fc-4a78-8977-19d2d4125e74","token_type":"bearer","refresh_token":"f657059b-c85e-4021-8600-7f8990243a6f","expires_in":1759,"scope":"read"} 

Но тогда, когда я пытаюсь достичь значения внутри POJO, большинство из них null, и заполняется только область.

ответ

1

После пары дней, пытающихся найти решение, я узнал, что не только поля @JsonProperty («access_token») относятся к процессу конверсии, но и имена полей и методов важны, поэтому, когда я изменил мой POJO из

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
     "access_token", 
     "token_type", 
     "refresh_token", 
     "expires_in", 
     "scope" 
}) 
public class UserToken { 

    @JsonProperty("access_token") 
    private String accessToken; 
    @JsonProperty("token_type") 
    private String tokenType; 
    @JsonProperty("refresh_token") 
    private String refreshToken; 
    @JsonProperty("expires_in") 
    private long expiresIn; 
    @JsonProperty("scope") 
    private String scope; 
    @JsonIgnore 
    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

    /** 
    * 
    * @return 
    * The accessToken 
    */ 
    @JsonProperty("access_token") 
    public String getAccessToken() { 
     return accessToken; 
    } 
.......... 

в

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
     "access_token", 
     "token_type", 
     "refresh_token", 
     "expires_in", 
     "scope" 
}) 
public class UserToken { 

    @JsonProperty("access_token") 
    private String access_token; 
    @JsonProperty("token_type") 
    private String token_type; 
    @JsonProperty("refresh_token") 
    private String refresh_token; 
    @JsonProperty("expires_in") 
    private long expires_in; 
    @JsonProperty("scope") 
    private String scope; 
    @JsonIgnore 
    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

    public String getAccess_token() { 
     return access_token; 
    } 

Все начали работать, как его должно быть, обратите внимание, что изменение было совпадать с именем поля POJO, что я получил от ответа.

EDIT:

Просто нашел, что правильный способ сделать это состоит в использовании SerializedName для элементов, ясное объяснение можно найти здесь: http://heriman.net/?p=5

Смежные вопросы