To jest krzyżowy post. Wysłałem to samo pytanie do wiosennych forów. http://forum.springsource.org/showthread.php?128579-Database-driven-Controller-MappingJak dynamicznie mapuje ścieżki spring-webmvc?
Hi Próbuję zrobić z bazy danych mapowania kontrolerów tak, że mogą się zmienić w wykonywania.
Do tej pory posiadam następujące informacje.
Adapter niestandardowego uchwytu, który można później zoptymalizować.
@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);
}
}
mój webmvc-config wygląda następująco (odpowiednia część)
Kod:
<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"/>
To wydaje się być picking prawidłowy sterownik. Jednakże I odbieranie błąd idąc do bazy danych określonej ścieżki (takie jak „/ 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)
....
Czy muszę zdefiniować klasę obsługi adnotacji?
Szczerze mówiąc, cały ten proces wydaje się trudniejszy niż powinien. Chcę, aby jeden kontroler obsługiwał wszystkie żądania do zewnętrznie zdefiniowanej ścieżki URL-a, to jest właściwy sposób, aby go obsłużyć.
Chciałbym również przekazać obiekt, który został dopasowany do kontrolera, jeśli jest to możliwe, zamiast wykonywać świeże wyszukiwanie w kontrolerze. To zasadniczo stworzy mój model dla widoku.
Wszelkie porady dotyczące tego, jak to działa?
EDIT Dla przypomnienia NPE jest tutaj
private boolean useTypeLevelMapping(HttpServletRequest request) {
if (!hasTypeLevelMapping() || ObjectUtils.isEmpty(getTypeLevelMapping().value())) {
return false;
}
return (Boolean) request.getAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING);
}
Kolejna Edycja wersja numery od 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>
Mam odpowiedział na pytanie myself poniżej ale nadal jestem zainteresowany osobami ważącymi się we właściwy sposób.
@fmucar co dokładnie bazodanowych jazdy wzorców uRL? Jego 90% tam swoją znalezieniu właściwego kontrolera po prostu nie jest poprawna metoda na kontrolerze. Jeśli mówisz o przekazaniu zmiennej do kontrolera, to przypuszczam, że najgorszy przypadek bym to zrobił ct to jako atrybut żądania i pobierz w kontroler stamtąd, ale to wydaje się być niezręczne. – Wes
Przepraszam, że źle zrozumiałem twoje q. Usunę powyższy komentarz – fmucar
Czy mógłbyś potwierdzić swoją wersję Spring MVC –