当从不返回null时,端点方法如何返回null?

时间:2014-04-13 09:02:30

标签: java android json google-app-engine endpoint

此方法属于我在Android Studio中使用Google App Engine后端的Android项目中的端点:

@ApiMethod(name = "getAllUnclaimedLeftovers")
public Collection<Leftover> getAllUnclaimedLeftovers() {
    Collection<Leftover> unclaimedLeftoverOffers = new ArrayList<Leftover>();

    for(Leftover leftover : ofy().load().type(Leftover.class)) {
        if (!leftover.isClaimed() && leftover.isValid()) {
            unclaimedLeftoverOffers.add(leftover);
        }
    }

    return unclaimedLeftoverOffers;
}

如您所见,永远不会返回null。 在这里,您可以通过相应gradle命令生成的客户端库,使用前一个后端方法在项目的应用程序端查看方法。

public static Collection<Leftover> getAllUnclaimedLeftovers() throws IOException {
    try {
        return Proxy.getEndpoint().getAllUnclaimedLeftovers().execute().getItems();
    } catch (IOException e) {
        Log.d("DataStore_UnclaimedLeftovers_Error", e.getMessage());
        throw e;
    }
}

我的问题是:最后一个方法如何返回null对象?

现在我正在检查null个对象,一切正常,应用程序和后端已部署并正常运行。

方法getAllUnclaimedLeftovers()用于:

private class UnclaimedLeftoversTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
            setUnclaimedLeftovers(LeftoverProxy.getAllUnclaimedLeftovers());
            setIsUnclaimedLeftoversSucceeded(true);
            return null;
        } catch (IOException e) {
            setIsUnclaimedLeftoversSucceeded(false);
            return null;
        } catch (NullPointerException e) {
            setIsUnclaimedLeftoversSucceeded(false);
            return null;
        }
    }
}

LeftoverProxy.getAllUnclaimedLeftovers()引用null对象。

查看自动生成的端点lib:

public GetAllUnclaimedLeftovers getAllUnclaimedLeftovers() throws java.io.IOException {    
    GetAllUnclaimedLeftovers result = new GetAllUnclaimedLeftovers();
    initialize(result);
    return result;
}

public class GetAllUnclaimedLeftovers extends EndpointRequest<com.frigoshare.endpoint.model.LeftoverCollection> {

    private static final String REST_PATH = "leftovercollection";


    protected GetAllUnclaimedLeftovers() {
      super(Endpoint.this, "GET", REST_PATH, null,   com.frigoshare.endpoint.model.LeftoverCollection.class);
    }

...
}

超类的构造函数:

public EndpointRequest(
  Endpoint client, String method, String uriTemplate, Object content, Class<T> responseClass) {
    super(
        client,
        method,
        uriTemplate,
        content,
        responseClass);
    }

在AbstractGoogleClientRequest中搜索时,我找到了execute()

 /**
   * Sends the metadata request to the server and returns the parsed metadata response.
   *
   * <p>
   * Subclasses may override by calling the super implementation.
   * </p>
   *
   * @return parsed HTTP response
   */
  public T execute() throws IOException {
    HttpResponse response = executeUnparsed();
    if (Void.class.equals(responseClass)) {
      response.ignore();
      return null;
    }
    return response.parseAs(responseClass);
  }

但是,在Google的代码中挖掘没有意义,libs必须实现正确的行为。我的意思是,或者你得到了一个反应,或者你得到了一个失败并抛出IOException,但不是介于两者之间的东西?

1 个答案:

答案 0 :(得分:0)

从我的Null后端获取空集合时,我收到GAE。 我尝试将空集合推送到jsonMappingException后端时收到GAE。 所以我想JSON(或Gradle的{​​{1}}插件)无法在两个方向上处理空集合。

由于这个项目适用于我的课程,我也看到了其他学生的项目有这种奇怪的行为。