2013-03-02 19 views
5

Mam końcowym generowana następująco:Powracający błędy z chmurą punktów końcowych Google

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; 
} 

Zastanawiam się w jaki sposób należy zwracać błędy do klienta. E.g. książka zawiera pewne wymagane pola, test ISNM itd.

Zakładam, że wyrzucę wyjątek, ale jak to odwzoruje na zwróconą odpowiedź JSON. Repson json powinien zawierać wszystkie błędy w polu, aby podświetlić te pola w kliencie.

+0

Czy uda Ci się rozwiązać ten problem? Jeśli tak, jak to zrobiłeś? – dynamokaj

+0

Nie, ale już mnie nie interesuje –

Odpowiedz

5

W ogólnej liczbie wyjątków są odwzorowywane na kod stanu HTTP 500 w odpowiedzi. Z następującymi wyjątkami można uzyskać różne kody: 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

Jeśli zużywać końcowym w Androidzie kod błędu będzie w IOException wrzucony tam i można odpowiednio zareagować w haczyku.

+0

Tak, rozumiem zwrot kodów błędów HTTP. Zastanawiam się, jak radzić sobie ze szczegółowymi komunikatami o błędach, takimi jak naruszone ograniczenia właściwości domeny. –

+0

To nie jest zachowanie, które widzę w 1.7.5. Wrzucam wyjątek BadRequestException, a klient dostaje 200 z moim komunikatem String w ciele jako trochę JSON. – Eliot

+0

Pozwól, że się zakwalifikuję: to nie działa na serwerze deweloperów locahost, ale * działa * prawdopodobnie na serwerze App Engine, nawet w wersji 1.7.5. Tak naprawdę jest to błąd na serwerze lokalnym localhost. – Eliot

0

Robię to poprzez posiadanie abstrakcyjnej jednostki klasy.

Ma kod odpowiedzi, który jest wyliczeniem i komunikatem o błędach łańcucha.

"Książka" może odziedziczyć po Entity. Twoja odpowiedź może wyglądać następująco:

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; 
} 
+0

Dzięki za odpowiedź @ davibq, ale to zanieczyszcza klasy encji imo. Może powinienem stworzyć SingleEntitiyResponse zawierający model, status odpowiedzi i błędy.Zauważ, że mogę zrobić to samo dla com.google.api.server.spi.response.CollectionResponse, rozszerzając go i włączając podobny status i błędy repsonse. –

3

Próbowałem czegoś takiego i wydawało mi się, że działa dobrze.

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; 
    } 
} 

Nie można zwrócić ogólnego obiektu z punktu końcowego. Stwórz więc odpowiednią klasę RestResponse, którą można utworzyć z odpowiedzi.

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

Status może być taki.

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

Wszystkie twoje końcowych metody wróci RestResponse które z kolei mogą być skonstruowane z odpowiedzi (T może być Twój obiekt fasola lub podmiot).

Po deserializacji odpowiedzi json (RestResponse) można od razu przekształcić ją w postaci odpowiedzi.

Mam nadzieję, że to pomoże.

Pozdrowienia, Sathya

+0

To nie działa dla mnie, otrzymuję: "Błąd: typ obiektu T nie jest obsługiwany." Przykład: public Response.RestResponse getBeer() { Response genericResponse = new Response (); \t GenericResponse.status = Status.SUCCESS; genericResponse.object = new Beer ("Carlsberg"); return genericResponse.toRestResponse(); } – dynamokaj

+0

@dynamokaj - czy możesz opublikować niektóre fragmenty kodu? Możesz utworzyć link do github lub innego dokumentu. – Sathya

+0

Tak, tutaj jest: https://gist.github.com/dynamokaj/cb0c0569311d9d15ee40 powinno być takie jak twoje. Jednak ustawiłem pola jako prywatne i wstawiłem je do jednego pliku (ResponseDto.java) zamiast trzech plików. – dynamokaj

Powiązane problemy