Este es un mensaje cruzado. También publiqué la misma pregunta en los foros de primavera. http://forum.springsource.org/showthread.php?128579-Database-driven-Controller-Mapping¿Cómo se pueden mapear las rutas spring-webmvc de forma dinámica?
Hola estoy tratando de hacer base de datos mapa de controladores accionados para que puedan cambiar en tiempo de ejecución .
Hasta ahora lo que tengo es el siguiente.
Adaptador de controlador personalizado que siempre se puede optimizar más adelante.
@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);
}
}
mi webmvc-config se ve de la siguiente manera (la parte pertinente) Código
:
<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"/>
Esto parece estar recogiendo el controlador correcto. Sin embargo Recibo un error cuando va a una trayectoria definida base de datos (por ejemplo, "/ 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)
....
¿Es necesario definir un controlador de anotación personalizada?
Para ser honesto, todo este proceso parece más difícil de lo que debería. Quiero que 1 controlador maneje todas las solicitudes a una ruta de URL definida externamente, esta es la forma correcta de hacerlo.
También me gustaría pasar el objeto que coincide con el controlador si esto es posible en lugar de hacer una nueva búsqueda en el controlador. Esto básicamente formará mi modelo para la vista.
¿Algún consejo sobre cómo hacerlo funcionar?
EDITAR Para el registro de la NPE es aquí
private boolean useTypeLevelMapping(HttpServletRequest request) {
if (!hasTypeLevelMapping() || ObjectUtils.isEmpty(getTypeLevelMapping().value())) {
return false;
}
return (Boolean) request.getAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING);
}
otra edición números de versión de la 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>
que he respondido a la pregunta a mí mismo más adelante pero todavía me interesan las personas que analizan la forma correcta de hacerlo.
@fmucar qué es exactamente la base de datos de conducir los patrones de URL? Su 90% no su conclusión el controlador correcto simplemente no es el método correcto en el controlador. Si estás hablando de pasar la variable al controlador supongo que en el peor de los casos, me inyectaría ct como un atributo de solicitud y buscar en el controlador desde allí, pero eso se siente torpe. – Wes
Lamento haber malinterpretado tu q. Eliminaré el comentario anterior – fmucar
¿Puede confirmar su versión de Spring MVC –