Reputation: 31
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?
Upvotes: 2
Views: 1716
Reputation: 31
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.
Upvotes: 0