2010-10-07 14 views
11

Próbuję uruchomić pierwszą instalację Spring 3 MVC.Konfiguracja Spring MVC: PageNotFound przy użyciu InternalResourceViewResolver

Moja aplikacja jest uruchomiona na Tomcat, w kontekście serwera „pocztą pantoflową”

Dla celów testowania, próbuję dostać się do żądania od http://localhost:8080/grapevine/test renderowania zawartości WEB-INF/jsp/noSuchInvitation.jsp

When staram się to, dostaję 404 i dzienniki wskazują, że moja JSP nie jest obecna:

WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] in DispatcherServlet with name 'grapevine' 

muszę mieć błędnie skonfigurowany to gdzieś, ale nie mogę zobaczyć, co zrobiłem źle.

Oto wszystkie istotne fragmenty.

web.xml:

<servlet> 
    <servlet-name>grapevine</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>grapevine</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Z mojego kontekstu:

<mvc:annotation-driven /> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

Kontroler:

@Controller 
public class ParticipantInvitationController { 

@RequestMapping("/test") 
public ModelAndView test() 
{ 
    return new ModelAndView("noSuchInvitation"); 
} 

Log:

DEBUG org.springframework.web.servlet.DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'noSuchInvitation'; URL [/WEB-INF/jsp/noSuchInvitation.jsp]] in DispatcherServlet with name 'grapevine' 
DEBUG org.springframework.web.servlet.view.JstlView - Forwarding to resource [/WEB-INF/jsp/noSuchInvitation.jsp] in InternalResourceView 'noSuchInvitation' 
DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'grapevine' processing GET request for [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] 
WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] in DispatcherServlet with name 'grapevine' 
DEBUG org.springframework.security.web.context.HttpSessionSecurityContextRepository - SecurityContext contents are anonymous - context will not be stored in HttpSession. 
DEBUG org.springframework.web.servlet.DispatcherServlet - Successfully completed request 
+0

Czy jesteś pewien, że nie ma błędów w pisowni? –

+0

możliwy duplikat [Brak odwzorowania dla żądania HTTP z identyfikatorem URI \ [/WEB-INF/pages/apiForm.jsp \]] (http://stackoverflow.com/questions/1266303/no-mapping-found-for-http -request-with-uri-web-inf-pages-apiform-jsp) – naXa

Odpowiedz

27

To dlatego, że <url-pattern> w swojej web.xml jest zbyt "szeroki". Wartość /* oznacza, że ​​serwlet jest skonfigurowany do odbierania wszystkich żądań, i który zawiera żądanie z serwletu do strony JSP. Komunikat o błędzie, który widzisz, pochodzi z DispatcherServlet, który otrzymuje własne przekazane żądanie.

Należy wybrać bardziej konkretny <url-pattern>, np. <url-pattern>/xyz/*</url-pattern>, aby Twój URL stał się http://localhost:8080/grapevine/xyz/test, a następnie powinien działać poprawnie.

+1

Jaka jest różnica między/* i just /? Mam webappa Spring skonfigurowanego niemal dokładnie tak samo jak Marty'ego, ale mój działa z serwletem dyspozytora zmapowanym do /. –

+3

@Ben: '/' będzie dopasowywał tylko główny adres URL, podczas gdy '/ *' będzie pasował do wszystkich adresów URL – skaffman

+2

To naprawiło problem, dziękuję. Jednak mam jedno pytanie. Biorąc pod uwagę stronę example.com, wzorzec adresu URL/będzie pasował tylko do http://example.com. Jak to możliwe, że żądanie do http://example.com/test jest przekierowywane do serwletu dyspozytora wiosennego? –

1

Rozwiązanie 1: Można zarejestrować serwlet na * .html i * .json (lub XML, gif, png ...):

<servlet> 
    <servlet-name>RestServlet</servlet-name> 
    <servlet-class> 
     org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>RestServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
    <url-pattern>*.html</url-pattern> 
    <url-pattern>*.json</url-pattern> 
</servlet-mapping> 

Rozwiązanie 2: Jeśli chcesz Miej aplet odwzorowywane na /*, dodać następujące do pliku spring.xml:

<mvc:default-servlet-handler/> 

I to do pliku web.xml:

<servlet-mapping> 
    <servlet-name>jsp</servlet-name> 
    <url-pattern>/WEB-INF/jsp/*</url-pattern> 
</servlet-mapping> 

<servlet> 
    <servlet-name>jsp</servlet-name> 
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> 
</servlet> 

Uzasadnienie jest wyjaśnione tutaj: spring, web.xml. Spowoduje to zarejestrowanie jawnego programu obsługi dla stron JSP z większym priorytetem niż /*.

2

Wystarczy wymienić /* na / jako numer url-pattern. To będzie działać...

+6

Trzeba też trochę wyjaśnić, dlaczego to działa. – Alfergon

0

UWAGA: Może to być mylący komunikat o błędzie. Po prostu mi się to przydarzyło.

Nawet myślałem komunikat o błędzie nieoczekiwanie zawiera/ContextName/... na początku ścieżki, to nadal może być błąd ortograficzny w dowolnym prefiksem InternalResourceViewResolver:

<property name="prefix" value="/WEB-INF-typo-Here/jsp/"/> 

lub sama ścieżka do pliku.

Teraz, gdy poprawiłem błąd, działa dobrze. Nie wiem, dlaczego kontekst pokazuje komunikat o błędzie i naprawdę zmusił mnie do zignorowania mojej głupiej literówki i próby wypróbowania wspaniałych innych wkładów w to pytanie. Nie pozwól, aby to się przydarzyło!

BTW, używam wersji Spring 4.0.0.

0

dla mnie Rozwiązałem problem za pomocą szablonów .jsp, a nie tylko .html.

Powiązane problemy