0

I have a Spring MVC application in which I am getting a 405 error whenever I request resources.

I have the following in my servlet.xml file:

<context:component-scan base-package="com.xetius"/>

<mvc:annotation-driven/>

<mvc:resources mapping="/images/**" location="classpath:/images/"/>
<mvc:resources mapping="/thumbs/**" location="classpath:/thumbs/"/>
<mvc:resources mapping="/gallery/**" location="classpath:/gallery/"/>
<mvc:resources mapping="/style/**" location="classpath:/style/"/>
<mvc:resources mapping="/script/**" location="classpath:/script/"/>
<mvc:resources mapping="/downloads/**" location="classpath:/downloads/"/>

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass">
        <value>org.springframework.web.servlet.view.tiles2.TilesView</value>
    </property>
</bean>

<bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/views/**/views.xml</value>
        </list>
    </property>
</bean>

and in my home.jsp file I have the following:

<img class="about" src="/images/about.jpg" alt="about" />

When I run this inside IntelliJ using Tomcat7 all resources are being returned as 405 Method Not Allowed. Below is the HAR for that request

{
  "startedDateTime": "2012-11-27T08:38:32.453Z",
  "time": 8,
  "request": {
    "method": "GET",
    "url": "http://localhost:8080/images/about.jpg",
    "httpVersion": "HTTP/1.1",
    "headers": [
      {
        "name": "Accept-Encoding",
        "value": "gzip,deflate,sdch"
      },
      {
        "name": "Accept-Language",
        "value": "en-GB,en-US;q=0.8,en;q=0.6"
      },
      {
        "name": "Cookie",
        "value": "JSESSIONID=0A0475B4404B037CD2FDD8876A02285A"
      },
      {
        "name": "Connection",
        "value": "keep-alive"
      },
      {
        "name": "Accept-Charset",
        "value": "ISO-8859-1,utf-8;q=0.7,*;q=0.3"
      },
      {
        "name": "Host",
        "value": "localhost:8080"
      },
      {
        "name": "User-Agent",
        "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11"
      },
      {
        "name": "Accept",
        "value": "*/*"
      },
      {
        "name": "Referer",
        "value": "http://localhost:8080/"
      }
    ],
    "queryString": [],
    "cookies": [
      {
        "name": "JSESSIONID",
        "value": "0A0475B4404B037CD2FDD8876A02285A",
        "expires": null,
        "httpOnly": false,
        "secure": false
      }
    ],
    "headersSize": 426,
    "bodySize": 0
  },
  "response": {
    "status": 405,
    "statusText": "Method Not Allowed",
    "httpVersion": "HTTP/1.1",
    "headers": [
      {
        "name": "Date",
        "value": "Tue, 27 Nov 2012 08:38:32 GMT"
      },
      {
        "name": "Content-Length",
        "value": "1045"
      },
      {
        "name": "Server",
        "value": "Apache-Coyote/1.1"
      },
      {
        "name": "Allow",
        "value": "POST"
      },
      {
        "name": "Content-Type",
        "value": "text/html;charset=utf-8"
      }
    ],
    "cookies": [],
    "content": {
      "size": 1045,
      "mimeType": "text/html",
      "compression": 0
    },
    "redirectURL": "",
    "headersSize": 173,
    "bodySize": 1045
  },
  "cache": {},
  "timings": {
    "blocked": 0,
    "dns": -1,
    "connect": -1,
    "send": 1,
    "wait": 6,
    "receive": 0,
    "ssl": -1
  },
  "pageref": "page_1"
}

When I check the WAR file, the specific file is located inside WEB-INF/classes/images.

I must be missing something, but this is driving me crazy. Anyone have any ideas?

Edit-

I have included my web.xml file here:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>a-Form Catering</display-name>
    <description>a-Form Catering Web Site</description>

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

    <servlet-mapping>
        <servlet-name>a-form</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

my servlet file is actually a-form-servlet.xml

James A Mohler
  • 10,562
  • 14
  • 41
  • 65
Xetius
  • 39,461
  • 24
  • 80
  • 118
  • Please enable logging and check what is printed in the console when you access the specified resource. A less effective but still a productive method is to set a break point in the DispatcherServlet itself. – Boris Treukhov Nov 27 '12 at 09:23

3 Answers3

1

It might be you missed the context of your application in the url

<img class="about" src="/WEBAPP_CONTEXT/images/about.jpg" alt="about" />

If you do not have any explicit context configuration, then I assume it is a name of your WAR file without .war extension.

You can also use JSTL core url tag in JSPs to reference resources.

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
   ..........................

 <img class="about" src="<c:url value="/images/about.jpg"/>" alt="about" />

In this case you do not need to specify the context.

Vasyl Keretsman
  • 2,428
  • 1
  • 16
  • 15
1

Could there be anything suspicious in your web.xml? If not, I have a hunch that it might be the UrlBasedViewResolver that hijacks your images. Could you try adding a viewNames property to restrict what it resolves, eg.:

<bean id="viewResolver" class="....UrlBasedViewResolver">
    ...
    <property name="viewNames" value=".jspwhatever" />
</bean>

(or congruently prefix and/or suffix properties).

Hope that helps.

Cheers,

Anders R. Bystrup
  • 14,996
  • 10
  • 58
  • 53
0

I'm sure this has been fixed, but in case others are having the same issue. I fixed a similar issue by changing the <url-pattern> to end with an *. This should map the DispatcherServlet to every path. See below:

    <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>a-Form Catering</display-name>
    <description>a-Form Catering Web Site</description>

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

    <servlet-mapping>
        <servlet-name>a-form</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>