Questo è un cross post. Ho anche postato la stessa domanda ai forum di primavera. http://forum.springsource.org/showthread.php?128579-Database-driven-Controller-MappingCome si fa a mappare dinamicamente i percorsi spring-webmvc?
Ciao Sto cercando di fare database di mappature del controller guidati in modo che possano cambiare in fase di esecuzione .
Finora quello che ho è il seguente.
Adattatore per gestore personalizzato che può essere sempre ottimizzato in seguito.
@Component
public class DatabasePageUrlHandlerMapping extends AbstractUrlHandlerMapping implements PriorityOrdered {
@Override
protected Object getHandlerInternal(HttpServletRequest request)
throws Exception {
String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
List<Page> pages = Page.findAllPages();
for (Page page : pages) {
if (lookupPath.equals(page.getSeoPath())) {
Object handler = getApplicationContext().getBean("_pageViewController");
return new HandlerExecutionChain(handler);
}
}
return super.getHandlerInternal(request);
}
}
mia webmvc-config appare come segue (la parte rilevante)
Codice:
<context:component-scan base-package="com.artiststogether"
use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller"
type="annotation" />
</context:component-scan>
<!-- If I don't put an order into this it doesn't fail over to the implementation why? -->
<bean class="com.artiststogether.web.DatabasePageUrlHandlerMapping" p:order="-1" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
Questo sembra essere raccogliendo il controller corretto. Tuttavia ricevo un errore quando si va in un percorso definito database (come "/ a")
java.lang.NullPointerException
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodResolver.useTypeLevelMapping(AnnotationMethodHandlerAdapter.java:675)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodResolver.resolveHandlerMethod(AnnotationMethodHandlerAdapter.java:585)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:431)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
....
Ho bisogno di definire un gestore di annotazione personalizzata?
Per essere onesti, questo intero processo sembra più difficile di quanto dovrebbe. Voglio che 1 controller gestisca tutte le richieste su un percorso url definito esternamente, è questo il modo corretto di spostarlo.
Vorrei anche passare l'oggetto che corrisponde al controller se questo è possibile piuttosto che fare una nuova ricerca nel controller. Questo fondamentalmente formerà il mio modello per la vista.
Qualche consiglio su come farlo funzionare?
EDIT Per la cronaca la NPE è qui
private boolean useTypeLevelMapping(HttpServletRequest request) {
if (!hasTypeLevelMapping() || ObjectUtils.isEmpty(getTypeLevelMapping().value())) {
return false;
}
return (Boolean) request.getAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING);
}
Un altro Modifica numeri di versione dal pom.xml
<properties>
<aspectj.version>1.6.12</aspectj.version>
<java.version>6</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<roo.version>1.2.1.RELEASE</roo.version>
<slf4j.version>1.6.4</slf4j.version>
<spring.version>3.1.0.RELEASE</spring.version>
<spring-security.version>3.1.0.RELEASE</spring-security.version>
</properties>
Ho risposto alla domanda io stesso qui sotto ma sono ancora interessato a persone che stanno valutando il modo corretto di farlo.
@fmucar cosa esattamente di database di guida dei modelli URL? il suo 90% non la sua conclusione non solo il metodo corretto sul controller del controller corretto. Se stai parlando di passare la variabile al controller, credo che il caso peggiore mi farebbe male ct come attributo di richiesta e preleva il controller da lì, ma sembra goffo. – Wes
Mi dispiace, devo aver frainteso il tuo q. Cancellerò il commento sopra – fmucar
Puoi confermare la tua versione di Spring MVC –