2013-06-17 5 views
21

Ho una classe che i modelli la mia richiesta, qualcosa comeVariabili di percorso associare a un oggetto del modello personalizzato in primavera

class Venue { 
    private String city; 
    private string place; 

    // Respective getters and setters. 
} 

e voglio sostenere un URL RESTful per ottenere informazioni su un luogo. Quindi ho un metodo di controllo come questo.

@RequestMapping(value = "/venue/{city}/{place}", method = "GET") 
public String getVenueDetails(@PathVariable("city") String city, @PathVariable("place") String place, Model model) { 
    // code 
} 

C'è un modo, posso dire in primavera per legare le mie variabili di percorso per l'oggetto del modello (in questo caso Venue) invece di ottenere ogni singolo parametro?

risposta

2

Come per la documentazione Spring disponibile a http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates, supporto automatico viene fornito solo a tipi semplici:

Un argomento @PathVariable può essere di qualsiasi tipo semplice come int, lungo, Data, ecc Spring converte automaticamente nel tipo appropriato o genera un TypeMismatchException se non riesce a farlo.

non ho provato questa combinazione specifica di @RequestParam e Model, ma sembra che si può raggiungere l'implementazione desiderata con la creazione di un custom WebBindingInitializer, come dettagliato in http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-typeconversion.

La classe personalizzata avrà accesso a WebRequest e restituirà un oggetto dominio popolato con i dati estratti da questa richiesta.

+0

credo, che sarebbe un po 'eccessivo per il mio caso d'uso. Ma grazie per il suggerimento. –

3

È possibile fornire un'implementazione dell'interfaccia HandlerMethodArgumentResolver. Questa interfaccia è utilizzata principalmente per risolvere argomenti ai metodi del controller in modi che Spring non può (che è essenzialmente ciò che si sta tentando di fare). Per realizzare ciò, l'attuazione di questi due metodi:

public boolean supportsParameter(MethodParameter mp) { 
    ... 
} 

public Object resolveArgument(mp, mavc, nwr, wdbf) throws Exception { 
    ... 
} 

è possibile iniettare l'implementazione nel contesto della molla tramite:

<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
     <bean class="com.path.ImplementationOfHandlerMethodArgumentResolver"/> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 

Quando Primavera incontra un parametro che non permette di risolvere, si chiamerà il metodo supportsParameter() per vedere se il resolver può risolvere il parametro. Se il tuo metodo restituisce true, Spring chiamerà il tuo metodo per risolvere il parametro. In questo metodo, si ha accesso all'oggetto NativeWebRequest, che è possibile utilizzare per afferrare il percorso oltre il contextPath. (nel tuo caso sarebbe: /venue/{city}/{place}) è possibile analizzare il percorso della richiesta e tentare di inserire le città/luogo Stringhe da inserire nell'oggetto Sede.

26

Spring MVC offre la possibilità di associare parametri di richiesta e variabili di percorso in un JavaBean, che nel tuo caso è Venue. Per esempio:

@RequestMapping(value = "/venue/{city}/{place}", method = "GET") 
public String getVenueDetails(Venue venue, Model model) { 
    // venue object will be automatically populated with city and place 
} 

Nota che il JavaBean deve avere city e place proprietà per farlo funzionare.

Per ulteriori informazioni, si può dare un'occhiata al withParamGroup() example from spring-projects/spring-mvc-showcase

Problemi correlati