Как отладить ресурс 404, не найденный в Spring MVC Rest?

У меня есть пример приложения Spring Rest mvc со следующим кодом Java:

SampleController.java

import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("sample")
public class SampleController {
        @RequestMapping(method = RequestMethod.GET, produces = "application/json")
        @ResponseBody
        public String getBatches()//@RequestParam(name = "name", required = true) String name)
        {
                return "Hello ";
        }
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ved</groupId>
    <artifactId>platform</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>platform Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <spring.version>4.2.1.RELEASE</spring.version>
        <jackson.version>2.6.2</jackson.version>
        <spring-boot.version>1.2.6.RELEASE</spring-boot.version>
        <filter.name>DEV</filter.name>
        <jersey.version>1.9</jersey.version>
        <base.directory>${basedir}</base.directory>
    </properties>
    <profiles>
        <profile>
            <id>local</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>local</value>
                </property>
            </activation>
            <properties>
                <filter.name>DEV</filter.name>
            </properties>
        </profile>
        <profile>
            <id>qa</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>qa</value>
                </property>
            </activation>
            <properties>
                <filter.name>QA</filter.name>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>prod</value>
                </property>
            </activation>
            <properties>
                <filter.name>PROD</filter.name>
            </properties>
        </profile>
    </profiles>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>1.8.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.4</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>
    </dependencies>
    <build>
        <!-- <filters> <filter>${basedir}/src/main/resources/ENV-${filter.name}/application.properties</filter> 
            </filters> -->
        <finalName>platform</finalName>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <debug>true</debug>
                    <debuglevel>source,lines</debuglevel>
                    <showDeprecation>true</showDeprecation>
                    <archive>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <systemPropertyVariables>
                        <environment>prod</environment>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.google.code.maven-svn-revision-number-plugin</groupId>
                <artifactId>maven-svn-revision-number-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>revision</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <entries>
                        <entry>
                            <prefix>svn</prefix>
                        </entry>
                    </entries>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>buildnumber-maven-plugin</artifactId>
                <version>1.0</version>
                <executions>
                    <execution>
                        <id>generate-timestamp</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>create-timestamp</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <format>{0,date,yyyy-MM-dd HH:mm}</format>
                    <items>
                        <item>timestamp</item>
                    </items>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

web.xml

<?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"
    id="WebApp_ID" version="3.0">

    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

диспетчер-сервлет.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd">

    <!-- <context:property-placeholder location="classpath:application.properties" 
        /> -->

    <context:annotation-config />
    <context:component-scan base-package="com.ved.platform" />

    <bean id="jacksonMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />

    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter" />
            </list>
        </property>
    </bean>
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

    <!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
        <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
        </bean> </list> </property> </bean> -->

    <mvc:resources mapping="/resources/**" location="/resources/" />

    <mvc:annotation-driven />

</beans>

домашняя страница предоставляет мне страницу apache, но как только я пытаюсь получить доступ к 127.0.0.1:8080/sample, у меня возникает ошибка 404. Все журналы об этом умалчивают. Не знаю, как это исправить.


person diwakarb    schedule 24.11.2015    source источник
comment
ты решил эту проблему? Если да, можете опубликовать решение, чтобы оно могло помочь другим.   -  person Nikhil Sahu    schedule 05.07.2016


Ответы (6)


Поместите точку останова в

org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getMatchingPattern (шаблон строки, путь поиска строки).

Вы увидите, почему по вашему запросу не найдено совпадений.

person isobretatel    schedule 12.07.2019

Вы должны добавить context path в URL-адрес - localhost:8080/<context-path>/sample. Обычно Context path будет вашим war именем файла, если вы развертываете приложение на Tomcat. Если ваше war имя файла - helloworld.war, тогда URL будет localhost:8080/helloworld/sample.

Если вы используете Tomcat, настроенный в Eclipse, вы можете установить context-path на вкладке «Модули».

Способы развертывания вашего приложения в Tomcat root -

  1. Вы можете сделать это, просто присвоив файлу war имя ROOT.war.

  2. В ROOT.xml файле вы должны указать эту конфигурацию <Context docBase="pathToWarFile" path="" reloadable="true" /> и убедиться, что ваш war файл не находится в webapps папке.

Если вы развертываете приложение в корне tomcat, указывать context path. Вы получите домашнюю страницу своего приложения с URL-адресом localhost:8080/. В вашем случае вы можете вызвать метод контроллера с URL-адресом localhost:8080/sample.

person Omkar Puttagunta    schedule 24.11.2015
comment
Вот мой ROOT.xml в Tomcat / conf / Catalina / localhost ‹Context docBase = platform path = reloadable = true /› - person diwakarb; 24.11.2015
comment
вы вручную развертываете приложение на Tomcat? Если да, то какая версия? - person Omkar Puttagunta; 24.11.2015
comment
Ok. В вашем ROOT.xml вместо docBase = platform укажите путь к вашему файлу войны, а затем перезапустите сервер. DocBase = 'pathTowarFile' и перезапустите сервер - person Omkar Puttagunta; 24.11.2015

Убедитесь, что вы сканируете пакеты, в которых находятся ваши контроллеры. В противном случае Spring не будет создавать beans для ваших контроллеров, и пути, которые они прослушивают, вернут 404.

person gary69    schedule 26.01.2018
comment
В: (Относительно Spring Boot): Как именно убедиться, что Spring Boot сканирует пакеты контроллеров, которые, как мы думаем, должны сканироваться? - person paulsm4; 10.12.2018
comment
Spring boot автоматически просканирует классы в том же пакете или в подпакетах вашего основного класса, помеченных @SpringBootApplication. В противном случае вам нужно определить @ComponentScan, чтобы дать ему дополнительные пакеты для сканирования. - person gary69; 11.12.2018
comment
В: Значит, нет способа получить список классов, которые Spring Boot на самом деле просканировал? В: А как насчет полного списка сопоставлений URL-путей? - person paulsm4; 11.12.2018
comment
Я думаю, что единственный способ - включить журналы отладки и передать их сценарию bash stackoverflow.com/questions/ 8543421 / - person gary69; 11.12.2018
comment
Достаточно честно - спасибо. Причина, по которой я спросил, заключается в том, что я включил ведение журнала в TRACE - и еще есть много волшебства, которое я хотел бы понять лучше. - person paulsm4; 11.12.2018

Если у вас есть сообщение «SLF4J: По умолчанию реализация регистратора не работает (NOP)»:

Добавьте зависимость к simple-logger следующим образом:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.5</version>
    </dependency>

Иначе

Нужен обратный поиск.

  1. Найдите сообщение, которое вам нравится. Эта статья подсказывает мне, что мне нужно сообщение No mapping found for HTTP request with.
  2. Поиск источников в Интернете вот так.

И вот строчка:

if (pageNotFoundLogger.isWarnEnabled()) {
  pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + getRequestUri(request) +
      "] in DispatcherServlet with name '" + getServletName() + "'");
}
  1. Наконец, найдите класс и добавьте уровень ведения журнала.
person Grim    schedule 27.12.2016
comment
Помогает, но в вашем ответе слишком много ссылок, чувствую себя археологом! - person pdem; 19.07.2019
comment
Средняя зарплата разработчика @pdem - 47к, археолога - 58к. Поддерживаю повышение зарплаты, если кто-то спросит. - person Grim; 19.07.2019

Во-первых, отображение вашего запроса должно быть - @RequestMapping ("/ sample"), а не @RequestMapping ("sample").

person asg    schedule 24.11.2015

Отображение URL-адреса вашего сервлета неверно. Это должно быть / * вместо /.

Взгляните на этот вопрос SO для разницы. Разница между / и / * в шаблоне URL-адреса сопоставления сервлета

person Mohit    schedule 24.11.2015