2013-04-16 12 views
5

Jestem pewien, że to jest pytanie typu noob, a ja spędziłem większą część godziny na trałowaniu stackoverflow, ale nikt nie wydaje się mieć mojego przypadku, więc tutaj idź ...Mieszanie REST i JSP w Spring MVC, nie mogę znaleźć JSP

Mam nową aplikację internetową, która używa Spring MVC. Większość aplikacji (99%) jest czystym REST, więc raczej nie wysyła "widoku" jako takiego, ale po prostu wysyła JSON z powrotem na przewód lub wysyła alternatywny status HTTP w przypadku błędów itp.

Wyjątek to strona logowania, która musi być rzeczywistą stroną JSP, ale w jakiś sposób konfiguracja, której używam do mapowania kontrolerów REST, pozostawia mnie w stanie, w którym normalne mapowanie JSP nie działa.

Oto co mam:

W moim dyspozytora serwletu konfiguracji, odpowiednie porcje są:

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

W moich prób, aby to działa, mam również dodać mapowanie do " HomeController”, które obecnie tylko przekierowuje do mojego logowania JSP:

<bean name="/" class="com.somepackage.HomeController"/> 

teraz w web.xml mam:

<servlet> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

<listener> 
    <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring-dispatcher-servlet.xml 
    </param-value> 
</context-param> 

Działa to dobrze dla moich relaksującego kontrolerów, które wyglądają tak:

@Controller 
@RequestMapping(value = "/api/user") 
public class BlahBlahController {... 

My "HomeController", które po prostu wygląda tak:

@Controller 
@RequestMapping(value = "/") 
public class HomeController extends AbstractController { 
    @Override 
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 
     return new ModelAndView("login"); 
    } 
} 

jest wyzwalane kiedy hit "/"url, ale pojawia się ten błąd w dziennikach:

WARNING: No mapping found for HTTP request with URI [/WEB-INF/pages/login.jsp] in DispatcherServlet with name 'spring-dispatcher' 

Teraz mam to, co mówi, nie wie, jak rozwiązać /WEB-INF/pages/login.jsp (strona ta istnieje btw), ale utknąłem, jak muszę zmienić rzeczy, aby to działało.

Jestem trochę zdezorientowany, jak to powinno działać. Czy ktoś ma jakieś wskazówki?

Dzięki.

+0

Nie jestem pewien, czy to ważne, ale dlaczego pan zdefiniował widok resolverowi dwukrotnie chciał? Również twój "HomeController" jest opatrzony adnotacją '@ Component' zamiast' @ Controller'. – NilsH

+0

Oh .. lol .. yeah duplikat jest błędem .. nie powinno mieć znaczenia, jak powiedziałeś. Rozróżnienie @ Component/@ Controller jest dobrze zauważone, zmienię się teraz i spróbuję ponownie. (Wpis edytowany w celu usunięcia tych błędów jako problem nadal występuje) –

+0

Tak więc bez pojawia się następujący błąd: Nie znaleziono mapowania dla HTTP żądanie z identyfikatorem URI [/] w ... Po mapowaniu otrzymuję taki sam błąd jak poprzednio: Nie znaleziono mapowania dla żądania HTTP z identyfikatorem URI [/WEB-INF/pages/login.jsp] w ... Nienawidzę mieć tego xml config tam .. Wolałbym, żeby wszystko było związane z adnotacją, ale mimo to nadal nie działa dla mnie –

Odpowiedz

6

OK. Znalazłem odpowiedź, jest to wzorzec adresu URL w konfiguracji dispatchera.

Zamiast:

<servlet-mapping> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Powinno być

<servlet-mapping> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

I rzeczywiście uznało tę odpowiedź gdzie indziej i próbował go jednak „myśli”, że nie działa, wtedy zrozumiał powód myślałem nie miało to związku z podstawową przyczyną.

Nie mam pojęcia, dlaczego to będzie działać, a drugi nie .. ale jeden problem naraz ...

-1

Umieść RequestMapping na poziomie metody, próbowałem na mój kod i zadziałało. Nie trzeba zdefiniować HomeController fasoli jeśli używasz @Controller i posiadające właściwego „kontekstowe: Składnik-Scan”

@Override 
@RequestMapping(value = "/") 
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 
    return new ModelAndView("login"); 
} 

można również skorzystać z poniższego kodu, jeśli po prostu chcesz przekierować widok logowania dla wszystkich "/" dostęp.

<mvc:view-controller path="/" view-name="login"/> 

Zamówienie projektu od github mvc show case za pomocne odniesienia.

+0

Jak już wspomniałem w poprzednich komentarzach, problem nie polega na tym, że kontroler nie został znaleziony, jest i jest uruchamiany. Problem polega na tym, że nie można znaleźć strony JSP, do której się przekierowuje. Nie znaleziono mapowania dla żądania HTTP z identyfikatorem URI [/WEB-INF/pages/login.jsp] w DispatcherServlet –

+0

Dobrze zmodyfikowałeś wzorzec adresu URL, który przeoczyłem. możesz docenić łatwość użycia sprężyny przez dodanie nie musisz pisać żadnego kontrolera – apurvc

+0

Dzięki za napiwek. Kontroler w poście był tylko przykładem. Jest tam więcej kodu, ale pomyślałem, że może być ważne, aby pokazać dokładne warunki, w których wystąpił problem. Używam elementu kontrolera widoku w innym miejscu i zgadzam się, że jest on rzeczywiście bardzo użyteczny. –