Java 翻新对象返回为null

Java 翻新对象返回为null,java,android,retrofit,rx-java,rx-android,Java,Android,Retrofit,Rx Java,Rx Android,我已经建立了一个服务来返回一些对象。在MainActivity中,我只需单击一个简单的按钮即可调用该服务。我似乎得到了某种对象,但我不觉得它实际上是从我指定的RESTAPI返回的。它显示在调试器中,但其属性为空: bFetch.setOnClickListener(v -> { v.startAnimation(AnimationUtils.loadAnimation(this, R.anim.image_click)); RetrofitService service = Servi

我已经建立了一个服务来返回一些对象。在MainActivity中,我只需单击一个简单的按钮即可调用该服务。我似乎得到了某种对象,但我不觉得它实际上是从我指定的RESTAPI返回的。它显示在调试器中,但其属性为空:

bFetch.setOnClickListener(v -> {
 v.startAnimation(AnimationUtils.loadAnimation(this, R.anim.image_click));
 RetrofitService service = ServiceFactory.createRetrofitService(RetrofitService.class, RetrofitService.SERVICE_ENDPOINT);
 service.getPosts()
 .subscribeOn(Schedulers.newThread())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(new Subscriber < Post > () {
  @Override
  public final void onCompleted() {
   Log.e("RetrofitService", "Retrofit Request Completed!");
  }

  @Override
  public final void onError(Throwable e) {
   Log.e("RetrofitService", e.getMessage());
  }

  @Override
  public final void onNext(Post post) {
   if (post != null) {
    // TODO: Some object is returned but its properties are null
    Log.e("RetrofitService", "Returned objects: " + post);
    Log.e("RetrofitService", "Object Id: " + post.getObjectId());
    mCardAdapter.addData(post);
   } else {
    Log.e("RetrofitService", "Object returned is null.");
   }

  }

 });

});

}
以及我的build.gradle,因为我知道所有不同的改装版本之间存在不一致:

dependencies {

    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'

    /* ReactiveX */
    compile 'io.reactivex:rxjava:1.0.17'
    compile 'io.reactivex:rxandroid:0.23.0'

    /* Retrofit */
    compile 'com.squareup.retrofit:retrofit:1.9.0'

    /* OkHttp3 */
    compile 'com.squareup.okhttp3:okhttp:3.8.1'

    /* RecylerView */
    compile 'com.android.support:recyclerview-v7:25.3.1'

    /* CardView */
    compile 'com.android.support:cardview-v7:25.3.1'

    /* Parse */
    compile 'com.parse:parse-android:1.13.0'

}
后课堂:

public interface RetrofitService {

 String SERVICE_ENDPOINT = "https://parseapi.back4app.com/";

 @Headers({
  "X-Parse-Application-Id: asdf",
  "X-Parse-REST-API-Key: asdf"
 })
 @GET("/classes/Post")
 Observable < Post > getPosts();

 /*curl -X GET \
         -H "X-Parse-Application-Id: asdf" \
         -H "X-Parse-REST-API-Key: asdf" \
 https://parseapi.back4app.com/classes/Post*/

}
public class Post implements Serializable {

    private static final String CLASS_NAME = "Post";

    private String objectId;
    private String text;

    public Post(String objectId) {
        this.setObjectId(objectId);
    }

    public static String getClassName() {
        return CLASS_NAME;
    }

    public String getObjectId() {
        return objectId;
    }

    private void setObjectId(String objectId) {
        this.objectId = objectId;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
>     https://parseapi.back4app.com/classes/Post/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   259  100   259    0     0    360      0 --:--:-- --:--:-- --:--:--   395{"results":[{"objectId":"ktEfgr1pFt","text":"Hello World.","createdAt":"2017-08-14T14:07:52.826Z","updatedAt":"2017-08-14T14:07:52.826Z"},{"objectId":"Mmh8l9gjCk","text":"Hello?","createdAt":"2017-08-14T15:19:01.515Z","updatedAt":"2017-08-14T15:19:03.743Z"}]}
卷曲响应:

public interface RetrofitService {

 String SERVICE_ENDPOINT = "https://parseapi.back4app.com/";

 @Headers({
  "X-Parse-Application-Id: asdf",
  "X-Parse-REST-API-Key: asdf"
 })
 @GET("/classes/Post")
 Observable < Post > getPosts();

 /*curl -X GET \
         -H "X-Parse-Application-Id: asdf" \
         -H "X-Parse-REST-API-Key: asdf" \
 https://parseapi.back4app.com/classes/Post*/

}
public class Post implements Serializable {

    private static final String CLASS_NAME = "Post";

    private String objectId;
    private String text;

    public Post(String objectId) {
        this.setObjectId(objectId);
    }

    public static String getClassName() {
        return CLASS_NAME;
    }

    public String getObjectId() {
        return objectId;
    }

    private void setObjectId(String objectId) {
        this.objectId = objectId;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
>     https://parseapi.back4app.com/classes/Post/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   259  100   259    0     0    360      0 --:--:-- --:--:-- --:--:--   395{"results":[{"objectId":"ktEfgr1pFt","text":"Hello World.","createdAt":"2017-08-14T14:07:52.826Z","updatedAt":"2017-08-14T14:07:52.826Z"},{"objectId":"Mmh8l9gjCk","text":"Hello?","createdAt":"2017-08-14T15:19:01.515Z","updatedAt":"2017-08-14T15:19:03.743Z"}]}
最终更新:我更改了
改装服务的
onNext()
方法,将其传递到CardAdapter,尽管此处未显示,超出了问题的范围

@Override
public final void onNext(PostResponse postResponse) {
 if (postResponse != null) {
  // TODO: Some object is returned but its properties are null
  Log.e("RetrofitService", "Objects successfully added to RecyclerView Adapter.");
  Log.e("RetrofitService", "Returned objects: " + postResponse.getResults());
  Log.e("RetrofitService", "Text " + postResponse.getResults().get(0).getText());

  mCardAdapter.addData(postResponse);
  //
 } else {
  Log.e("RetrofitService", "Object returned is null.");
 }

}

在维修中尝试使用以下类别

@GET("/classes/Post")
Observable <PostResponse> getPosts();
@GET(“/classes/Post”)
可观察的getPosts();
响应后包装类

public class PostResponse {
    private List<Post> results;

    public List<Post> getResults() {
        return results;
    }

    public void setResults(List<Post> results) {
        this.results = results;
    }
}
公共类PostResponse{
私人名单结果;
公共列表getResults(){
返回结果;
}
公共void setResults(列出结果){
这个结果=结果;
}
}

根据您问题的更新,您收到的不是单个对象,而是一个包含
Post
对象集合的对象

因此,您需要再添加一个类:

public class Results {
   List<Post> results = ArrayList<>()
} 
同时,API方法在路径的开头有斜杠:

 @GET("/classes/Post")
 Observable < Post > getPosts();
@GET(“/classes/Post”)
可观察getPosts();
据我所知,在改型过程中,端点地址中应该有尾随斜杠,API方法中应该有起始斜杠,否则这可能无法正常工作

这个应该是正确的:

String SERVICE_ENDPOINT = "https://parseapi.back4app.com"; // No slash here
@GET("/classes/Post") // Keep slash here, or vice verse
Observable<Results> getPosts();
字符串服务\u端点=”https://parseapi.back4app.com"; // 这里没有斜线
@GET(“/classes/Post”)//在此处保留斜杠,或反之亦然
可观察的getPosts();

仅对“依赖项”部分的一些评论:

您使用io.reactivex:rxandroid版本
0.23.0
,而最新版本是
1.2.1
,有什么特殊原因吗


您不需要
io.reactivex:rxjava:1.0.17
依赖关系,因为改型1.9.0已经依赖于rxjava 1.0.0

似乎您正在尝试获取由parse sdk创建的对象。确保Post类的数据结构与端点返回的内容相匹配(例如使用字符串)。顺便说一句,我会屏蔽问题的url和凭据。我用Post对象更新了我的问题。我真的看不出有什么问题……您是否也可以提供来自curl-X GET-H“X-Parse-Application-Id:asdf”-H“X-Parse-REST-API-Key:asdf”的json响应,并用json响应再次更新。我更新了我的评论。现在错误很明显:您应该为包含Post对象列表的包装器对象创建一个包装器类。谢谢。关于尾随斜杠,你是对的。我清理了我的依赖关系。我只使用0.23.0,因为我在以前的项目中使用过0.23.0(在一个稍微不同的实现中)。看起来改装最近经历了很多变化。不幸的是,我仍然得到空对象属性。可能是因为我正在返回一个列表,而不是像托尔斯滕所说的那样处理它。只是需要注意的是,
reformationservice.getPosts:URL路径“classes/Post”必须以“/”开头。
,根据我的监视器。@santafebound您发布了json响应主体,我更新了我的答案。将封装在结果字段中的另一个对象中的Post对象集合反分析为单个Post对象。这才是真正的错误。不是尾随的斜杠。你们让我很难回答这个问题。两个答案肯定都有帮助。是的,我必须把你提供的课程中我要返回的名单整理一下。我认为托尔斯滕比我更应该得到奖励。他首先回答说:)很酷,但我认为答案还应该包括关于尾随斜杠的部分,这样其他人也能得到这一点。干杯,伙计们。