2013-05-06 3 views
5

Sto scrivendo un webservice.In quale livello deve essere eseguita la validazione?

In genere l'input sarà un documento XML e l'output XML o JSON.

L'applicazione utilizza lo scalpiccio MVC, avendo diversi strati

  • Controllers: Ricevi XML e fornire la risposta (XML/JSON)
  • Servizio: logica di business, transazioni
  • DAO: Interrogare l'origine dati (un Database o forse un altro servizio web)

La mia comprensione è che la convalida di base (ovvero XML contro XSD) dovrebbe essere eseguita il prima possibile sul livello Controller.

Dopo di che, ho ancora bisogno di eseguire la convalida in più, alcuni di tali convalide sono di base, ad esempio

  • formato della data deve essere corretta
  • nome utente non può superare i caratteri X (forse anche da svolgere sull'XSD?)

Per quanto ho capito, tali convalide di base dovrebbero essere eseguite quando si elimina l'XML in un oggetto Java. Che sarebbe anche happend nello strato di controllo (anche se la convalida si sarebbe fatto da parte dell'oggetto Java in cui l'XML è deserializzati in)

E infine io faccia più "complessi" convalide esempi

  • la data non deve essere anteriore al 1950 (solo un esempio casuale)
  • Se il valore a è maggiore di B, allora il valore C non deve superare D

Tali valiations "complessi" sembra essere di per candidato adatto per l'interfaccia javax.validation.Validator. E sembra anche che dovrebbero essere fatti nel livello Controller.

Le domande sono

  1. E` approccio corretto? Devo anche convalidare qualcosa su altri livelli?
  2. Sto aggiungendo troppa logica nei controller? Dovrei forse spostare qualche convalida sul livello di servizio in cui si trova la logica di business?
+1

Per me, la cosiddetta convalida "complessa" sembra più una necessità aziendale e come tale dovrebbe essere applicata a livello di business logic. – mawia

+0

@mawia Un buon punto, e grazie a dio ho citato la parola "complesso" :) –

risposta

2

Questo approccio è corretto? Devo anche convalidare qualcosa su altri livelli?

Sì, parzialmente. Sembra corretto convalidare i dati di input per correttezza come il formato della data, la lunghezza, ecc. Non è necessario trasferirli ai livelli interni. Devono essere convalidati in anticipo.

Potrebbero esserci alcune convalide in base alle regole aziendali, che devono essere eseguite a livello di servizio, ad esempio se il nome utente/email è già stato registrato mentre si aggiunge l'utente al sistema, che verrà eseguito nel livello di servizio.

Sto aggiungendo troppa logica nei controller? Dovrei forse spostare qualche convalida sul livello di servizio in cui si trova la logica di business?

Non è considerato come logica dal mio punto di vista. La convalida dei dati nel controller è diversa dall'aggiunta della logica aziendale ad essa. Non stai alterando/manupolando i dati, ma controllando la correttezza dei dati.

Come accennato in precedenza, alcune convalide che seguono le regole aziendali devono essere implementate nel livello di servizio.

Edit: Come avete aggiunto tag web-service, immaginare che si sta chiamando un servizio web & poi a lato server, si è venuto a sapere che i dati ha un formato improprio. Potrebbe aver salvato un viaggio di andata e ritorno, l'ora del server, la risorsa di rete ecc. Se fosse stata convalidata in precedenza.

+0

Dire che devo convalidare che un nome utente non deve superare i 15 caratteri e dovrebbe essere unico. La restrizione di 15 caratteri sarebbe avvenuta nel controller e il controllo dell'unicità sarebbe avvenuto nel livello servizio/business? – Aquillo

+1

@Aquillo Sì, è possibile limitare la richiesta all'interno del controller per la convalida della lunghezza ecc. Piuttosto che procedere fino al livello di servizio per identificarlo. Pertanto, i dati devono passare attraverso la fase di convalida primaria iniziale per procedere a quella successiva, che è un approccio più pulito e favorevole. –

+0

Ok grazie per aver verificato il mio approccio :) – Aquillo