Quale modello è adatto per inviare più tipi di risposte tramite il servizio web REST?

0

Ho molti servizi Web in stile REST che supportano le risposte di tipo XML e JSON. Ora devo modificare i servizi Web esistenti in modo tale da fornire il tipo di risposta Protobuf.

Lo sviluppatore che ha sviluppato questi servizi ha creato tre livelli. Service layer, DAO layer e Processing layer.

Il livello di servizio chiama uno dei metodi di elaborazione dei livelli e richiama il livello di elaborazione dei metodi DAO e restituisce JSON o XML type response (POJO) al servizio. Il livello di servizio rinvia quindi questo POJO al client.

Ad esempio, se viene chiamato il servizio per aggiungere list of items , il codice appare approssimativamente come mostrato di seguito:

@Path("/item")
class ShoppingItemService {
    // annotations
    public ItemAddResponse addList(/* parameters required for this method */) {
        ItemProcessor processor = new ItemProcessor();
        ItemAddResponse response = processor.process(/* pass some data to processing layer */);
        return Response.ok().format("XML").build(response);
    }
}

Qui ItemAddResponse è già annotato con JAXB annotazioni di tipo per XML risposta e altre annotazioni per JSON risposta.

Non riesco a riutilizzare lo stesso ItemAddResponse perché Protobuf genera le sue classi utilizzando i file di schema.

La classe processore ha tutta la logica aziendale e se voglio aggiungere il supporto per Protobuf allora ho creato un nuovo metodo nel processore e copia-incolla quasi tutta la logica aziendale, ma restituisco solo l'oggetto della classe generata da protobuf.

Questo approccio richiede molto tempo e ci sono almeno 50 metodi simili in cui devo fare il lavoro di copia-incolla. Voglio evitare questo e vorrei progettare una soluzione elegante.

Mi piacerebbe sapere come posso aggiungere supporto per Protobuf con quantità minime di modifiche?

Sto leggendo Head First Design patterns book ma questo libro è davvero enorme e ci vorrà molto tempo per trovare un modello di design adeguato.

Esiste qualche schema di progettazione che può essere utile in questo tipo di situazioni?

Grazie,

Chandrashekhar

    
posta Shekhar 13.08.2014 - 11:53
fonte

2 risposte

3

If I want to add support for Protobuf then I have create new method in processor and copy-paste almost all the business logic

NO!

Un approccio orientato agli oggetti

  • ItemProcessor "ha tutta la logica aziendale". Non inquinare la classe, mantieni rigorosamente la logica aziendale
  • La tua struttura dati / risposta è universale. JSON, XML, protobuf sono solo diverse rappresentazioni sintattiche della stessa cosa.
  • Tutti i livelli esistenti operano sulla stessa struttura dati, tutto ciò di cui hanno bisogno è ricevere o inviare nella forma desiderata (JSON, XML, protobuf)
  • Hai bisogno di qualcosa che si trasformi tra i vari formati in modo che il client, ItemProcessor , qualunque sia, ottenga il formato che si aspetta.

OO Design Sketch

  • Un'istanza ItemProcessor ha bisogno di un oggetto Translator per ottenere i dati da o da, o entrambi, la forma desiderata.

  • ItemProcessor forse ha bisogno di diversi Translator s per l'interazione con il client e DAO rispettivamente.

  • Quindi dobbiamo creare un ItemProcessor / Translator composito in fase di esecuzione. modelli di progettazione creativa aiutaci a farlo.

  • Può darsi che tu finisca per progettare una singola classe statica, Translator .

  • Gli schemi di progettazione non dettano il tuo design. Iniziare con un foglio di carta bianco e dire "Voglio usare il modello di disegno xyz" è sbagliato, sbagliato, sbagliato.

Adattamento di un modello al tuo progetto

Hai ancora bisogno di progettare cose. Solo tu puoi definire le varie parti in generale. Da lì, un modello creazionale ci mostra come disaccoppiare la creazione di un oggetto dal suo utente. In questo modo evitiamo il problema come citato all'inizio di questa risposta.

Guarda schemi di progettazione della creazione come factory , abstract factory e builder .

Il modello di progettazione che si usa è generalmente guidato dalla complessità della costruzione dell'oggetto dato. Che ci sono 3 tipi di fabbrica che hanno a che fare con la complessità.

Per esempio, dirai alla fabbrica, ecc., di costruire qualcosa con la trasformazione "JSON - protobuffer". Quindi potresti recuperare un ItemProcessor che ha un oggetto JSONprotobufTranformer, o XMLprotobufTransformer, o ... qualsiasi cosa.

    
risposta data 13.08.2014 - 19:53
fonte
1

Mi chiedo che ciascun parametro di input sia diverso o meno. Ad ogni modo potresti essere in grado di restituire il risultato come Oggetto e lanciarlo. Inoltre potresti essere in grado di ottenere parametri come Oggetto.

Forse stai cercando come generare metodi in runtime. link

Ti consiglio di fare tutti i metodi. Penso che potrebbe essere buono per la leggibilità.

    
risposta data 13.08.2014 - 16:39
fonte

Leggi altre domande sui tag