5

我有一个如下生成的端点:

public Book insertBook(Book book) {
    PersistenceManager mgr = getPersistenceManager();
    try {
        if (containsShout(book)) {
            throw new EntityExistsException("Object already exists");
        }
        mgr.makePersistent(book);
    } finally {
        mgr.close();
    }
    return book;
}

我想知道我应该如何将错误返回给客户端。例如,这本书包含一些必填字段、ISNM 检查等。

所以我会假设抛出一个异常,但这如何映射到返回的 json 响应。json 响应应包含所有字段错误以在客户端中突出显示这些字段。

4

3 回答 3

5

通常,异常会映射到响应中的 500 http 状态代码。除了以下例外,您可以获得不同的代码: com.google.api.server.spi.response.BadRequestException-> 400 com.google.api.server.spi.response.UnauthorizedException-> 401 com.google.api.server.spi.response.ForbiddenException-> 403 com.google.api.server.spi.response.NotFoundException-> 404

如果你在 Android 中使用你的端点,错误代码将在那里抛出的 IOException 中,你可以在 catch 中做出相应的反应。

于 2013-03-02T18:53:43.300 回答
3

我尝试了这样的事情,似乎对我很有效。

class Response<T> {
   Status status; 
   String userFriendlyMessage;
   T object; //your bean or entity object

   RestResponse toRestResponse() {
      RestResponse r = new RestResponse();
      r.status = status;
      r.userFriendlyMessage = userFriendlyMessage;
      r.object = object;
   }
}

您不能从端点返回通用对象。因此,创建一个可以从 Response 创建的等效 RestResponse 类。

class RestResponse {
   Status status;
   String userFriendlyMessage;
   Object object;
}

状态可以是这样的。

public enum Status {
   SUCCESS, RESOURCE_NOT_FOUND, RESOURCE_ALREADY_EXISTS; //etc
}

您的所有端点方法都将返回 RestResponse ,它又将由 Response 构造(T 可以是您的 bean 或实体对象)。

当您反序列化您的 json 响应 (RestResponse) 时,您可以立即将其反序列化为 Response。

希望这可以帮助。

问候, 沙迪亚

于 2013-04-26T10:42:02.887 回答
0

我通过拥有一个抽象类实体来做到这一点。

它有一个 ResponseCode,它是一个枚举和一个 String ErrorMessage。

所以“书”可以从实体继承。您的回复可能如下所示:

public Book insertBook(Book book) {
    PersistenceManager mgr = getPersistenceManager();
    try {
        if (containsShout(book)) {
            book.setResponseCode(ResponseCode.ERROR);
            book.setError("Object already exists");
        } else {
            mgr.makePersistent(book);
        }
    } finally {
        mgr.close();
    }
    return book;
}
于 2013-03-04T15:48:45.363 回答