spring mvc i 404

0

W web.xml mam servlet:

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

Dzialaja '/cloud/signup' i '/cloud/newuser'. Chce zrobic PathVariable. W Cloud.java:

@RequestMapping("/cloud")
@Controller
@SuppressWarnings("unused")
public class Cloud {
....
@RequestMapping(value = "/user/{user}")
    public ModelAndView dashBoard(@PathVariable("user") String user) {
        return new ModelAndView("dashboard");
    }
}
 

Przy zadaniu 'host/cloud/user/nazwa tomcat wyrzuca '404 not found'
Czego brakuje?

Dzieki
KP

0

A plik z tym widokiem masz?

0

Tak. W tym samym katalogu co pozostale dzialajace.
Co ciekawe, czasem tomcat nawet nie wrzuca w logach ze nie moze znaleŹĆ.

0
  1. Zapinasz sie debugerem w tej metodzie kontrolera i upewniasz się że w ogóle sie tam łapie i parametr wczytuje
  2. Pokaż cały web.xml, spring-context.xml i pokaz strukturę katalogów.
0
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <display-name>Genotick.com</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>basic</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>basic</servlet-name>
        <url-pattern>/legal</url-pattern>
        <url-pattern>/howto</url-pattern>
        <url-pattern>/results</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>cloud</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cloud</servlet-name>
        <url-pattern>/cloud/signup</url-pattern>
        <url-pattern>/cloud/newuser</url-pattern>
        <url-pattern>/cloud/user</url-pattern>
        <url-pattern>/cloud/user/*</url-pattern>
    </servlet-mapping>
</web-app>
 

cloud-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="com.alphatica.genotick.cloud" />

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>
 

spring-context.xml nie ma (dopiero teraz przelaczylem sie na idea U i mi krzyczy ze context nie skonfigurowany ale inne rzeczy i tak dzialaja).

Katalogi:
WebContent -> WEB-INF -> jsp -> i tu pliki newuser.jsp signup.jsp i dashboard.jsp

Jak sie podpiac debuggerem jesli testuje wara na tomcat?

0

Hej, żeby podpiąć się debugiem do tomcata, wywołaj:

set JPDA_ADDRESS=8000
set JPDA_TRANSPORT=dt_socket
bin/catalina.bat jpda start 

A Potem podepnij się środowiskiem na localhost port 8000 - nie wiem, jakie masz?

0

@Krzywy Pomidor wstaw breakpointa w kodzie a potem po prostu daj na projekcie "debug" i wybierz że ma startować na tomcacie. IntelliJ sobie poradzi.

0

Nie łapie tego breakpointa, czyli tak jak myślałem tomcat nawet nie dochodzi to tego miejsca.
W logach mam coś takiego:


22-Oct-2015 22:31:39.042 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler Mapped URL path [/cloud/signup] onto handler 'cloud'
22-Oct-2015 22:31:39.043 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler Mapped URL path [/cloud/signup.*] onto handler 'cloud'
22-Oct-2015 22:31:39.043 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler Mapped URL path [/cloud/signup/] onto handler 'cloud'
22-Oct-2015 22:31:39.043 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler Mapped URL path [/cloud/newuser] onto handler 'cloud'
22-Oct-2015 22:31:39.044 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler Mapped URL path [/cloud/newuser.*] onto handler 'cloud'
22-Oct-2015 22:31:39.044 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler Mapped URL path [/cloud/newuser/] onto handler 'cloud'
22-Oct-2015 22:31:39.044 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler Mapped URL path [/cloud/user/{user}] onto handler 'cloud'
22-Oct-2015 22:31:39.045 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler Mapped URL path [/cloud/user/{user}.*] onto handler 'cloud'
22-Oct-2015 22:31:39.045 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler Mapped URL path [/cloud/user/{user}/] onto handler 'cloud'
22-Oct-2015 22:31:39.087 INFO [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.DispatcherServlet.initServletBean FrameworkServlet 'cloud': initialization completed in 289 ms
22-Oct-2015 22:32:30.425 WARNING [http-nio-8080-exec-3] org.springframework.web.servlet.PageNotFound.noHandlerFound No mapping found for HTTP request with URI [/cloud/user/alamakota] in DispatcherServlet with name 'cloud'
 

Jak zrobie to samo bez PathVariable to chodzi ok.

0

A dodaj tam do tej metody kontrolera która ma to łapac method = RequestMethod.GET

0

@Shalom:
Próbowałem. Nie pomogło. Da się włączyć jakieś logowanie debuga w servlet dispatcher?

0

A można wiedzieć w jakim celu masz to

    <servlet-mapping>
        <servlet-name>cloud</servlet-name>
        <url-pattern>/cloud/signup</url-pattern>
        <url-pattern>/cloud/newuser</url-pattern>
        <url-pattern>/cloud/user/*</url-pattern>
    </servlet-mapping>

zamiast po prostu

	<servlet-mapping>
                <servlet-name>cloud</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
0

Mam dwa servlety. Jeden obsługuje jedną część, drugi /cloud.

0

No to w jakim pakiecie jest ten kontroler? Bo może component scan jest źle ustawiony i ci nie wykrywa kontrolera? Pokaż więcej kodu...

0

Fragment web.xml:

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

Fragment cloud-servlet.xml:

<context:component-scan base-package="com.alphatica.genotick.cloud" />

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
 

Cloud.java:

package com.alphatica.genotick.cloud;
/// imports...

@RequestMapping("/cloud")
@Controller
@SuppressWarnings("unused")
public class Cloud {
    /// ... inne metody, ktore dzialaja.
    @RequestMapping(value = "/user/{user}", method = RequestMethod.GET)
    public ModelAndView dashBoard(@PathVariable("user") String user) {
        ;
        return new ModelAndView("dashboard");
    }
 
0

Chyba widzę co zrobiłes. To jest taki troche corner-case i niezbyt oczywista sprawa. Jak dajesz wildcard w mappingu servletu to defaultowo jest tam parametr "use full path" ustawiony na false, co znaczy że Springowy servlet będzie szukał kontrolera za samą gwiazdkę. Tzn w twoim przypadku jak zrobisz /cloud/user/cloud/user/alamakota to zadziała ;] Nie kombinuj tak, tylko ustaw po ludzku, w twoim przypadku po prostu /cloud/

0

Nie wiem osochozi.
Zmienilem web.xml na:

  <servlet-mapping>
        <servlet-name>cloud</servlet-name>
        <url-pattern>/cloud/</url-pattern>
    </servlet-mapping>
 

I wszystko (/cloud) przestalo dzialac.
Zmienilem na

    <servlet-mapping>
        <servlet-name>cloud</servlet-name>
        <url-pattern>/cloud/signup</url-pattern>
        <url-pattern>/cloud/newuser</url-pattern>
        <url-pattern>/cloud/</url-pattern>
    </servlet-mapping>
 

Nie pomoglo.

Zmienilem Cloud.java na


@RequestMapping("/cloud/")
@Controller
@SuppressWarnings("unused")
public class Cloud {
...
 

Bez zmian.

0

Wrzuć gdzieś ten projekt, albo jakąś okrojoną wersję bo sie nie dogadamy chyba...

0

Dzięki za chęć pomocy ale uparłem się aby to zrobić samemu.

0

W takim razie po prostu zamiast kombinować mapuj wszystko jednym servletem na / i będzie działać ;] Bo nie bardzo widzę jaki sens ma u ciebie rozbijanie tego na kawalki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1