2
votes

I am developing a simple spring REST web service. From the research I did there could be two types of 404 exceptions. For example,

@Controller
@RequestMapping("/person")
@Transactional(readOnly=true)
public class PersonController {     
    @RequestMapping(value="/data", method={RequestMethod.GET,RequestMethod.POST})
    @ResponseStatus(value=HttpStatus.OK)
    public Person getPerson() {
        return service.getPerson();
    }
}

Type 1: http://localhost/myws/person/get will throw a 404 from web service.
Type 2: http://localhost/myws/idontexist will throw a 404 from web server container. In my case it is tomcat.

To handle, Type 1, I tried extending DefaultHandlerExceptionResolver and overriding handleNoSuchRequestHandlingMethod
To handle Type 2, I added the below snippet in my web.xml

<error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/pages/notfound.jsp</location>
    </error-page>
    <error-page> 
        <exception-type>java.lang.Throwable</exception-type> 
        <location>/WEB-INF/pages/notfound.jsp</location> 
    </error-page>
My servlet xml looks like,

    <context:component-scan base-package="com" />
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="ignoreAcceptHeader" value="true" />
        <property name="order" value="1" />
        <property name="contentNegotiationManager">
            <bean class="org.springframework.web.accept.ContentNegotiationManager">
                <constructor-arg>         
                    <bean class="org.springframework.web.accept.ParameterContentNegotiationStrategy">
                        <constructor-arg>
                            <map>
                                <entry key="json" value="application/json"/>
                                <entry key="xml" value="application/xml"/>
                            </map>
                        </constructor-arg>
                    </bean>
                </constructor-arg>
            </bean>
        </property>
        <property name="defaultViews">
            <list>

                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <constructor-arg>
                        <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                            <property name="autodetectAnnotations" value="true"/>
                        </bean>
                    </constructor-arg>
                </bean>
            </list>
        </property> 
    </bean>

    <bean id="viewResolver"
              class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
              <property name="order" value="2" />
              <property name="prefix">
                  <value>/WEB-INF/pages/</value>
               </property>
              <property name="suffix">
                 <value>.jsp</value>
              </property>
        </bean>
    <!--To handle Internal Server Errors -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">
        <property name="order" value="1"/>
    </bean>
    <bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver" >
        <property name="order" value="2"/>
    </bean>
    <!--RestExceptionHandler extends DefaultHandlerExceptionResolver -->
    <bean class="com.rest.exception.RestExceptionHandler">
        <property name="order" value="3"/>
    </bean>   
    <!-- data source and Daos...-->

When I hit the Type 2 URL, I am getting the below Exception. WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/myws/WEB-INF/pages/notfound.jsp] in DispatcherServlet with name 'restservlet'

But my JSP is present in the mentioned location. What could be the problem?

1

1 Answers

0
votes

This is what I did. I created a controller to handle 404 instead of JSP as I couldn't get the problem with JSPs. It works as expected.