How to debug 404 resource not found in spring remainder of mvc?

I have an example spring rest mvc application that has the following java code:

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> 

dispatcher-servlet.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> 
Homepage

gives me the apache page, but as soon as I try to access 127.0.0.1:8080/sample, it causes a 404 error. The logs are all silent about this. Not sure how to fix it.

+8
source share
6 answers

You should add context path to url - localhost:8080/<context-path>/sample . Normally, the context path will be your name war if you deploy the application to Tomcat . If your file name is war helloworld.war , then the URL will be localhost:8080/helloworld/sample .

If you are using Tomcat configured in Eclipse , you can set the context-path on the Modules tab.

Ways to deploy your application to Tomcat root -

  • You can do this by simply calling the war file as ROOT.war

  • In the ROOT.xml file ROOT.xml you must specify this configuration <Context docBase="pathToWarFile" path="" reloadable="true" /> and make sure your war file is not in the webapps folder.

If you deploy the application to the tomcat root directory, there is no need to specify a context path . You will receive the home page of your application with the localhost:8080/ URL localhost:8080/ . In your case, you can call the controller method with the localhost:8080/sample URL.

+2
source

If you have "SLF4J: by default, to perform the" Inaction "(NOP) operation" logger ":

Add a dependency on a simple registrar as follows:

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

Otherwise

Reverse search required.

  • Find what message you want to see. This article gives me a hint that I need the message No mapping found for HTTP request with .
  • Searching for online sources like this .

And here we have a line:

 if (pageNotFoundLogger.isWarnEnabled()) { pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + getRequestUri(request) + "] in DispatcherServlet with name '" + getServletName() + "'"); } 
  1. Finally, find the class and add the logging level.
+2
source

Make sure you scan the packages that your controllers include. Otherwise, spring will not create beans for your controllers, and the paths they listen to will return 404.

+1
source

First, your query mapping should be @RequestMapping ("/ sample"), not @RequestMapping ("sample")

0
source

The display of the servlet URL is incorrect. It should be / * instead of /.

Take a look at this SO question for a difference. Difference between / and / * in url pattern for servlet mapping

0
source

Put a breakpoint at

org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getMatchingPattern (String template, String lookupPath).

You will understand why there is no match for your request.

0
source

Source: https://habr.com/ru/post/1236676/


All Articles