這是一個交叉帖子。我也向春季論壇發佈了同樣的問題。 http://forum.springsource.org/showthread.php?128579-Database-driven-Controller-Mapping如何動態地映射spring-webmvc路徑?
您好我想做數據庫驅動器映射,使他們能夠在運行改變。
到目前爲止我所擁有的如下。
自定義處理程序適配器,可隨時進行優化。
@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,配置如下所示(相關部分)
代碼:
<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%有其找到正確的控制器只是沒有在控制器上的正確方法。 如果你談論把變量傳遞給控制器,我想最壞的情況是我會注入把它作爲請求屬性並從控制器中取出,但感覺笨重。 – Wes 2012-07-20 15:00:20
對不起,我一定誤解了你的q。我將刪除上述評論 – fmucar 2012-07-20 15:40:33
您能否確認您的Spring MVC版本 – 2012-07-20 17:39:21