Venendo da Struts2 Sono abituato a dichiarare @Namespace
annotazioni sulle classi super (o package-info.java
) ed ereditando le classi sarebbero successivamente salire sul valore nella @Namespace
annotazione dei suoi antenati e anteporre al percorso di richiesta per l'azione. Ora sto cercando di fare qualcosa di simile in Spring MVC utilizzando @RequestMapping
annotazione come segue (codice tagliati per brevità):Spring MVC @RequestMapping Inheritance
package au.test
@RequestMapping(value = "/")
public abstract class AbstractController {
...
}
au.test.user
@RequestMapping(value = "/user")
public abstract class AbstractUserController extends AbstractController {
@RequestMapping(value = "/dashboard")
public String dashboard() {
....
}
}
au.test.user.twitter
@RequestMapping(value = "/twitter")
public abstract class AbstractTwitterController extends AbstractUserController {
...
}
public abstract class TwitterController extends AbstractTwitterController {
@RequestMapping(value = "/updateStatus")
public String updateStatus() {
....
}
}
/
opere come si aspettano/user/dashboard
funziona come previsto- Tuttavia quando lo farei mi aspettavo che
/user/twitter/updateStatus
funzionasse e non controlla i registri Posso vedere una voce di registro che assomiglia a qualcosa:
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mappato sentiero URL [/ tweeter/updateStatus] sul gestore 'twitterController'
C'è un'impostazione che posso permettere che eseguirà la scansione del superclassi per le annotazioni @RequestMapping
e costruire il percorso corretto?
Inoltre, suppongo che la definizione di @RequestMapping
su un pacchetto in package-info.java
sia illegale?
Avete per caso qualche altro suggerimento su come raggiungere questo obiettivo. Mi sembra uno spreco dover mettere/x/y/z in un ambiente di sottoclasse. E poi se ho deciso di cambiare/x/a/k/devo andare in tutto il posto nel codice in cui è definito e cambiarlo manualmente! – garyj
@chris: questo non funziona per me. C'è una fase di configurazione in questione o è solo un problema di annotazione? Il controller di base si trova infatti nello stesso pacchetto del controller che estende il controller di base. Tuttavia, l'URI/RequestMapping del controller di base viene ignorato e/o non trovato. "org.springframework.web.servlet.DispatcherServlet: 947 - Nessuna mappatura trovata per richiesta HTTP con URI". Quindi, se utilizzo semplicemente il RequestMapping "base" del controller esteso, va bene. Se provo a utilizzare RequestMapping ereditato dal controller di base, non riesco a trovare l'URI. – Rick
Vale la pena dichiarare esplicitamente che i percorsi di super classe sono ancora instradabili. Ovvero, scavalcando una classe e fornendo nuovi '@ RequestMapping's non sovrascrive o sostituisce' @ RequestMapping' della super-classe, ne aggiunge solo altri. Nella domanda dell'OP sopra, ad esempio, ciò significa che tutti questi percorsi sono validi: '/ user/dashboard','/twitter/updateStatus'. – kuporific