Results 1 to 6 of 6

Thread: ContentNegotiatingViewResolver with text/html results in PageNotFound exception

  1. #1
    Join Date
    Nov 2009
    Location
    Montreal, Quebec
    Posts
    398

    Default ContentNegotiatingViewResolver with text/html results in PageNotFound exception

    I'll try to be brief.

    My web.xml looks like this:

    Code:
    <?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>Test Hibernate Webapp</display-name>
    	
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>/WEB-INF/test-*.xml</param-value>
    	</context-param>
    	
    	<filter>
    		<filter-name>springSecurityFilterChain</filter-name>
    		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    	</filter>
    	
    	<filter-mapping>
    		<filter-name>springSecurityFilterChain</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    	
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
    	
    	<servlet>
    		<servlet-name>test</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    	
    	<servlet-mapping>
    		<servlet-name>test</servlet-name>
    		<url-pattern>/*</url-pattern>
    	</servlet-mapping>
    	
    	<welcome-file-list>
    		<welcome-file>index.html</welcome-file>
    	</welcome-file-list>
    	
    </web-app>

    I have a ContentNegotiatingViewResolver and an InternalResourceViewResolver setup like this:

    Code:
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    		<property name="ignoreAcceptHeader" value="true" />
    		<property name="favorPathExtension" value="true" />
        	<property name="mediaTypes">
        		<map>
        			<entry key="html" value="text/html" />
        			<entry key="json" value="application/json" />
        		</map>
        	</property>
        	<property name="defaultViews">
        		<list>
        			<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
        		</list>
        	</property>
        </bean>
        
        <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:contentType="text/html">
        	<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        	<property name="prefix" value="/WEB-INF/jsp/" />
        	<property name="suffix" value=".jsp" />
        </bean>

    My controller looks like this:

    Code:
    @Controller
    public class EventController {
    
    	@Autowired
    	private EventService eventService;
    	
    	@RequestMapping(value = "/events/save", method = RequestMethod.POST)
    	public ModelAndView saveEvent ( @ModelAttribute("event") Event event, BindingResult result ) {
    		ControllerUtil.logBindingErrors ( result );
            
            eventService.addEvent ( event );
            
            return new ModelAndView ( "redirect:/events.html" );
        }
    	
    	@RequestMapping(value = "/events", method = RequestMethod.GET)
    	public ModelAndView getEvents() {
    		Map<String, Object> model = new HashMap<String, Object>();
    		model.put ( "events", eventService.getAllEvents() );
    		
    		return new ModelAndView ( "eventsView", model );
    	}
    	
    	@RequestMapping(value = "/events/add", method = RequestMethod.GET)
    	public ModelAndView addEvent ( @ModelAttribute("event") Event event, BindingResult result) {
    		return new ModelAndView ( "eventAdd" );
    	}
    	
    }
    My context root is hibernate1, so if I browse to http://localhost:8080/hibernate1/events.json, it works fine. Chrome tries to just download as a file, but in the end this will get called in an ajax request. The json file that Chrome downloaded looks fine, the data is turned into a json object without a problem. The problem I'm having is if I browse to http://localhost:8080/hibernate1/events.html, I get an org.springframework.web.servlet.PageNotFound exception with message "noHandlerFound - No mapping found for HTTP request with URI [/hibernate1/WEB-INF/jsp/eventsView.jsp] in DispatcherServlet with name 'test'"

    Your help is appreciated.
    Thanks.

  2. #2

    Default

    have you tried setting the defaultcontentype to be text/html

    Code:
     <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="0">
            <property name="mediaTypes">
                <map>
                    <entry key="atom" value="application/atom+xml"/>
                    <entry key="xml" value="application/xml"/>
                    <entry key="json" value="application/json"/>
                    <entry key="html" value="text/html"/>
                </map>
            </property>
            
            <property name="defaultContentType" value="text/html"/>
    
            
            <property name="ignoreAcceptHeader" value="true"/>
            <property name="favorPathExtension" value="true"/>
    
            <property name="viewResolvers">
    			<list>
    				<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    					<property name="prefix" value="/WEB-INF/jsp/"/>
    					<property name="suffix" value=".jsp"/>
    				</bean>
    
    			</list>
    		</property>
    
    
            <property name="defaultViews">
                <list>
                    <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                        <property name="marshaller">
                            <bean class="org.springframework.oxm.xstream.XStreamMarshaller" p:autodetectAnnotations="true"/>
                        </property>
                    </bean>
                    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
    
                </list>
            </property>
        </bean>
    Looks like this is inspected if the ignoreAcceptHeader is set to true. Works for me :-)

  3. #3
    Join Date
    Nov 2009
    Location
    Montreal, Quebec
    Posts
    398

    Default

    Just tried that and I still get this exception:

    WARN 2010-01-14 09:56:36 [org.springframework.web.servlet.PageNotFound]
    {noHandlerFound - No mapping found for HTTP request with URI [/hibernate1/WEB-INF/jsp/eventsView.jsp] in DispatcherServlet with name 'test'}

  4. #4
    Join Date
    Nov 2009
    Location
    Montreal, Quebec
    Posts
    398

    Default

    I also know that the request is being mapped to my controller properly because the log output also spits out the following from Hibernate, which means my service bean is being called:

    Hibernate: select this_.EID as EID4_0_, this_.EDATE as EDATE4_0_, this_.ETITLE as ETITLE4_0_ from PATRICK.EVENTS this_

  5. #5
    Join Date
    Nov 2007
    Posts
    122

    Default

    Did you resolve this issue?

  6. #6
    Join Date
    May 2008
    Posts
    10

    Default org.springframework.web.servlet.view.ContentNegoti atingViewResolver

    What is the association between web.xml and dispatch servlet configurations?


    <servlet-mapping>
    <servlet-name>addServlet</servlet-name>
    <url-pattern>/*</url-pattern>
    </servlet-mapping>

    *AND*

    <property name="mediaTypes">

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •