2016-01-04 11 views
5

Si prega di trovare il mio HomeController e DemoControllerAccesso più controller con stessa richiesta mappatura

class HomeController{ 
@RequestMapping(value="index") 
public void home(){ 
} 
} 

class DemoController{ 
@RequestMapping(value="index") 
public void demo(){ 
} 
} 

quando cerco di inviare una richiesta a indice, che si otterrà eseguito? Volevo sapere come possiamo avere lo stesso valore di mappatura richiesta per più controllori

+1

Non è possibile. Un URL può essere mappato solo su un singolo controller. Deve essere unico. –

+0

Si noti che questo sarebbe comunque privo di significato. L'intero punto di un URL è che ti dice dove ottenere qualcosa. – chrylis

+2

Non è privo di significato quando si usano i controller per separare un gran numero di metodi, ma aggiungendo un frammento extra a ogni metodo che lo differenzia, in questo modo il percorso è ancora unico poiché ogni metodo ha una mappatura diversa, non ci sono collisioni. Comunque la primavera, il mvc sembra non volerlo. – raspacorp

risposta

2

In Spring Web MVC questo non è possibile. Ogni mappatura deve essere unica nel tuo contesto. In caso contrario, riceverai un RuntimeException durante l'inizializzazione del contesto.

Non è nemmeno possibile utilizzare i parametri per differenziare gli endpoint perché non vengono valutati durante la ricerca di un gestore adatto (applicabile agli ambienti Servlet). Da @RequestMapping javadoc:

In un ambiente servlet, le mappature dei parametri sono considerate restrizioni applicate a livello di testo. La mappatura del percorso primario (vale a dire il valore URI specificato) deve ancora identificare in modo univoco il gestore di destinazione, con i mapping dei parametri che esprimono semplicemente le precondizioni per richiamare il gestore.

Si noti che è possibile fare l'opposto, quindi più URL possono puntare allo stesso gestore. Date un'occhiata a Spring MVC: Mapping Multiple URLs to Same Controller

+1

Tale documentazione è almeno parzialmente obsoleta. Grazie per averlo menzionato; Esaminerò e potrei aprire un problema con i documenti. – chrylis

+0

@Marco Ferrari cosa succede se voglio creare due classi di controller con lo stesso RequstMapping e ognuno di essi ha Metodi diversi e un diverso metodo RequestMappings –

+0

@MeladEzzat è accettabile. Provalo con una rapida modifica dell'avvio di Boot [qui] (https://spring.io/guides/gs/spring-boot/) –

4

Sfortunatamente, questo non è possibile. La mappatura della richiesta deve essere unica altrimenti l'applicazione non può determinare a quale metodo deve essere associata la richiesta in ingresso.

Che cosa si può fare, invece è quello di estendere la mappatura richiesta:

class HomeController{ 

    @RequestMapping(value="home/index") 
    public void home(){ 
    } 
} 

class DemoController{ 

    @RequestMapping(value="demo/index") 
    public void demo(){ 
    } 
} 
5

https://stackoverflow.com/a/34590355/2682499 è solo parzialmente corretto a questo punto.

È possibile disporre di più metodi di controller che utilizzano lo stesso URI finché si forniscono a Spring informazioni aggiuntive sufficienti su quale deve essere utilizzato. Se si desidera o no fare fare questa è una domanda diversa. Certamente non consiglierei di usare lo stesso URI in due classi di controller separate per evitare confusione, comunque.

È possibile fare qualcosa di simile:

class HomeController{ 
    @RequestMapping(value="/index", params = {"!name", "!foo"}) 
    public List<Something> listItems(){ 
     // retrieve Something list 
    } 

    @RequestMapping(value="/index", params = "name") 
    public List<Something> listItems(String name) { 
     // retrieve Something list WHERE name LIKE %name% 
    } 

    @RequestMapping(value="/index", params = {"!name", "foo"}) 
    public List<Something> listItems(String foo) { 
     // Do something completely different 
    } 
} 

Per la documentazione completa su ciò che è possibile quando il sovraccarico URI si dovrebbe fare riferimento alla documentazione @ReqeustMapping: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html. E, in particolare, https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params-- per i parametri di richiesta della sezione.

Problemi correlati