2013-10-30 9 views
7

Perché c'è questa limitazione in Google Cloud Endpoint:cloud Endpoint: Array o raccolte di tipi di entità non sono ammessi

Arrays or collections of entity types are not allowed. 

Per un API con il metodo:

@ApiMethod(name = "getCollection", path = "getCollection", httpMethod = HttpMethod.POST) 
public ArrayList<MyObject> getCollection(List<MyObject> pMyObjects) { 

E qual è il modo migliore per aggirare questo? Grazie!

+0

Dove hai trovato la documentazione di Google di ciò che è e non è consentito per i tipi di entità? – Drux

risposta

6

Penso che il motivo per cui non è supportato è perché i parametri denominati nella firma del metodo finiscono per essere parametri di query URL e non vogliono inquinarli con lunghi elenchi di elementi. Inoltre, supportano solo un singolo oggetto di un tipo Entity nella firma, poiché questo diventa automaticamente il "corpo della richiesta". Puoi leggere su di esso here in the docs.

Come per aggirarlo, si crea un oggetto entità contenitore per il "corpo della richiesta". Il piacevole effetto collaterale di questo è che l'API Explorer espande i pezzi dell'oggetto della tua entità nella GUI e ti aiuta a fare correttamente il JSON.

Ecco un esempio che aggiunge una mappa denominata "patchFieldOps" per l'implementazione dell'aggiornamento parziale. Puoi mettere tanti campi nell'oggetto Entity come preferisci. Penso che se si incorporano più tipi definiti dall'utente, sarà necessario avere anche l'annotazione @Entity.

@Entity 
public class EndpointUpdateRequestBody { 
    // Since Google Cloud Endpoints doesn't support HTTP PATCH, we are overloading 
    // HTTP PUT to do something similar. 
    private Map<String, String> patchFieldsOps; 

    public EndpointUpdateRequestBody() { 
     patchFieldsOps = new HashMap<String, String>(); 
    } 

    public EndpointUpdateRequestBody(Map<String, String> patchFieldsOps) { 
     this.patchFieldsOps = patchFieldsOps; 
    } 

    public Map<String, String> getPatchFieldsOps() { 
     return patchFieldsOps; 
    } 

    public void setPatchFieldsOps(Map<String, String> patchFieldsOps) { 
     this.patchFieldsOps = patchFieldsOps; 
    } 
} 

...

@ApiMethod(
     name = "stuff.update", 
     path = "stuff/{id}", 
     httpMethod = ApiMethod.HttpMethod.PUT 
) 
public Group update(
     User apiUser, 
     @Named("id") String id, 
     @Nullable @Named("name") String name, 
     @Nullable @Named("description") String description, 
     EndpointUpdateRequestBody requestBody) 
     throws OAuthRequestException, InternalServerErrorException, NotFoundException, 
     BadRequestException, UnauthorizedException, ConflictException { 
+0

Non ho dubbi che funzionerebbe, ma vedo Endpoint come se mi stesse dando tutto ciò che Spring stava già facendo, ma con un tempo di latenza molto più basso. Attualmente Endpoint è più veloce, ma Spring è migliore. Forse mi manca qualcosa, ma non è questo l'obiettivo degli Endpoint? Vorrei chiedere direttamente agli autori, ma a Google non piacciono più i gruppi e costringe ciò che dovrebbe essere la discussione dei prodotti in StackOverflow, quindi dobbiamo segnalarli come bug. Sarebbe bello sapere direttamente dalla gente di Endpoint dove andare con questo in modo che gli sviluppatori possano pianificare di conseguenza. Nel frattempo proverò il tuo lavoro! – Shaun

Problemi correlati