2015-05-05 10 views
9

Ho la seguente classe:Personalizza i parametri e i campi della richiesta di mappatura all'interno del DTO?

public class MyDTO { 

     private String kiosk; 
     ... 
} 

e seguente URL:

http://localhost:1234/mvc/controllerUrl?kiosk=false 

e seguendo il metodo di controllo:

@RequestMapping(method = RequestMethod.GET, produces = APPLICATION_JSON) 
@ResponseBody 
public ResponseEntity<List<?>> getRequestSupportKludge(final MyDTO myDTO, BindingResult bindingResult) { 
    ... 
} 

Ora si sta lavorando campo bello e booleano risolve correttamente.

Ora parametro url è cambiato in questo modo:

http://localhost:1234/mvc/controllerUrl?new_kiosk=false 

Io non voglio cambiare il nome del parametro all'interno del DTO. C'è modo di dire primavera per capire che il valore del parametro di richiesta new_kiosk deve essere inserito nel campo kiosk?

+0

Qual è il tipo di dati (JSON/XML ecc.) Che stai accettando dal front end? – RE350

+0

@ RE350 È solo ottenere parametri. url come questo ** controllerUrl? new_kiosk = false ** – gstackoverflow

+1

Suggerisco caldamente una lettura della specifica java bean. Una proprietà è solo il nome del getter/setter su come il campo è chiamato internamente non importa. Se il tuo campo è chiamato 'foo' e hai un metodo' setBar' che imposta il valore di 'foo' hai una proprietà' bar'. Proprietà! = Campo. –

risposta

11

Oltre all'impostazione di un setter aggiuntivo è possibile passare il caso creando un risolutore di argomenti personalizzato. Ci sono alcuni modi per procedere, ma c'è già un ben discusso post. Se fossi in te, mi concentrerei sulla risposta del jkee. Seguire passo dopo passo, e poi tutto si dovrebbe fare è annotare il DTO con qualcosa di simile,

public class MyDTO { 

     @ParamName("new_kiosk") 
     private String kiosk; 
     ... 
} 

Notare che anche se non è possibile modificare MyDTO di classe, è ancora possibile seguire un percorso di risoluzione personalizzato. In questo post ho risposto a come è possibile scrivere un'annotazione del tipo di parametro. Combinando i due post puoi facilmente creare un'annotazione, ad es. @ParamMapper che definirebbe il mapping dalla richiesta alle proprietà. Pensa a qualcosa come

getRequestSupportKludge(@ParamMapper("new_kiosk;kiosk") MyDTO myDTO, BindingResult bindingResult) 
3

Ci sono diversi modi per farlo.

Se è possibile modificare MyDTO classe il modo più semplice è quello di aggiungere un setter come suggerito da M.Deinum:

public class MyDTO { 

     private String kiosk; 
     ... 
     public void setNew_kiosk(String kiosk) { 
      this.kiosk = kiosk; 
     } 
} 

In questo modo, è possibile elaborare http://localhost:1234/mvc/controllerUrl?kiosk=false così come http://localhost:1234/mvc/controllerUrl?new_kiosk=false

Se sei non è consentito farlo (poiché il DTO fa parte di una libreria che non è possibile modificare o ...), è possibile utilizzare un filtro mappato su /mvc/controllerUrl, che avvolgerebbe la richiesta con un valore personalizzato HttpServlerRequestWrapper che sovrascriverà i seguenti metodi:

String getParameter(String name) 
Map<String,String[]> getParameterMap() 
Enumeration<String>  getParameterNames() 
String[] getParameterValues(String name) 

chiamare i metodi della richiesta sottostante ed elaborare il nome del parametro speciale. Esempio:

String[] getParameterValues(String name) { 
    String[] values = req.getParameterValues(name); // req is the wrapped request 
    if ("kiosk".equals(name) && (values == null) { // will accept both names 
     values = req.getParameterValues("new_kiosk"); // try alternate name 
    } 
    return values; 
} 

Questo sarà molto più difficile da scrivere e di prova, in modo che solo andare in questo modo, se non è possibile modificare MyDTO classe.

Si potrebbe anche provare a utilizzare un'implementazione personalizzata di WebBindingInitializer.Da Spring Framework Reference Manual:

di esternare i dati di inizializzazione vincolante, è possibile fornire un'implementazione personalizzata dell'interfaccia WebBindingInitializer, che poi attiva fornendo una configurazione personalizzata per un chicco di AnnotationMethodHandlerAdapter, ignorando così la configurazione di default.

Attenzione: l'utilizzo consigliato è quello di registrare editor personalizzati per un'intera applicazione, non il caso d'uso. E Spring Framework è oftern descritto come facile da estendere ma non da sostituire. Caveat emptor ...

Sommario: tenta di utilizzare il metodo 1, se non è possibile, quindi utilizzare method2, e solo provare method3 se avete altre ragioni per usare un costume WebBindingInitializer

Problemi correlati