Spring MVC RESTful多视图 - 404 Not Found

时间:2013-04-19 01:10:38

标签: java spring-mvc view restful-architecture

我有一个将JSP作为视图的Web应用程序。但现在我正在尝试在同一个Web应用程序中实现RESTful。我创建了一个新的控制器,这将是我的RESTful(我不确定它是否有意义)。

我通过互联网找到了一些例子,我一直试图按照这些例子制作我的RESTful。

当我访问我的RESTful URL时,它会返回 404 Not Found 。我在stackoverflow中看了一些类似的问题,并尝试更改一些XML配置,但到目前为止它都不起作用。

When I access:
URL: localhost:8080/restfultest/rest/suggestions/11
returns me: 404.

When I access:
URL: localhost:8080/restfultest/loginForm
Returns me the correct JSP page.

我想,也许我需要设置XML以兼容两种类型,RESTful和一个常见的Web应用程序,但我不确定,我不确切知道如何做到这一点。

谢谢并遵循我的代码:

我的web.xml

<servlet>

    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>

        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-context.xml</param-value>

    </init-param>

    <load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

弹簧context.xml中

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

    <mvc:annotation-driven />

    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
        <property name="contentType" value="application/json"/>
    </bean>

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <util:list id="beanList">
                <ref bean="jsonMessageConverter"/>
            </util:list>
        </property>
    </bean>

    <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


    <mvc:interceptors>

        <bean class="com.restfultest.interceptor.AutorizadorInterceptor"></bean>
        <bean class="com.restfultest.interceptor.ConnectionInterceptor"></bean>

    </mvc:interceptors>

<mvc:resources location="/resources/" mapping="/resources/**" />

控制器

public class SuggestionController {

    @Autowired
    private SuggestionService suggestionService;

    @Autowired
    private View view;

    private static final String DATA_FIELD = "data";
    private static final String ERROR_FIELD = "error";

    private static final String CONTENT_RANGE_HEADER = "Content-Range";
    private static final String ACCEPT_JSON = "Accept=application/json";

    @RequestMapping(value = "/rest/suggestions/{suggestionId}", method = RequestMethod.GET, headers=ACCEPT_JSON)
    public ModelAndView getSuggestion(@PathVariable("suggestionId") String suggestionId) {

        Suggestion suggestion = null;

        if (isEmpty(suggestionId) || suggestionId.length() < 5) {
            String sMessage = "Error invoking getSuggestion - Invalid suggestion Id parameter";
            return createErrorResponse(sMessage);
        }

        try {

            suggestion = suggestionService.getSuggestionById(suggestionId);

        } catch (Exception e) {
            String sMessage = "Error invoking getSuggestion. [%1$s]";
            return createErrorResponse(String.format(sMessage, e.toString()));
        }

        return new ModelAndView(view, DATA_FIELD, suggestion);
    }

    private ModelAndView createErrorResponse(String sMessage) {
        return new ModelAndView(view, ERROR_FIELD, sMessage);
    }

    public static boolean isEmpty(String s_p) {
        return (null == s_p) || s_p.trim().length() == 0;
    }

1 个答案:

答案 0 :(得分:2)

问题是你的SuggestionController上应该有一个@Controller注释,所以Spring会将它当作一个Controller(它也应该在com.restfultest包中)。

现在我不确定这是否重要,但在你有

的spring-context.xml中
 <context:component-scan base-package="com.restfultest." />

我从来没有在最后用圆点看过它。所以你可以考虑删除它,但它可能没有什么区别。