【发布时间】:2012-07-20 14:53:30
【问题描述】:
这是一个交叉帖子。我也在春季论坛上发布了同样的问题。 http://forum.springsource.org/showthread.php?128579-Database-driven-Controller-Mapping
您好,我正在尝试进行数据库驱动的控制器映射,以便它们可以在运行时进行更改。
到目前为止,我所拥有的如下。
自定义处理程序适配器,以后总是可以优化。
@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);
}
}
我的 webmvc-config 如下(相关部分)
代码:
<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"/>
这似乎选择了正确的控制器。但是,当转到数据库定义的路径(例如“/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)
....
我需要定义一个自定义注解处理程序吗?
老实说,这整个过程似乎比应有的困难。我想要 1 个控制器来处理对外部定义的 url 路径的所有请求,这是正确的方法吗?
如果可能的话,我还想将匹配的对象传入控制器,而不是在控制器中重新查找。这基本上将形成我的视图模型。
关于如何使它工作的任何建议?
编辑 为了记录,NPE在这里
private boolean useTypeLevelMapping(HttpServletRequest request) {
if (!hasTypeLevelMapping() || ObjectUtils.isEmpty(getTypeLevelMapping().value())) {
return false;
}
return (Boolean) request.getAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING);
}
另一个编辑 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>
我已经在下面自己回答了这个问题,但我仍然希望人们能找到正确的方法。
【问题讨论】:
-
@fmucar 究竟是什么数据库驱动了 url 模式?它的 90% 在那里它找到了正确的控制器,而不是控制器上的正确方法。如果您谈论将变量传递给控制器,我想最坏的情况是我会将其作为请求属性注入并从那里获取控制器,但这感觉很笨重。
-
对不起,我一定误解了你的问题。我会删除上面的评论
-
能否确认您的 Spring MVC 版本
-
@BijuKunjummen 我已将版本添加到票证中。版本 3.1.0 发布
标签: java spring-mvc path