在Spring 3.0 MVC Restful映射中不重复两次路径

时间:2010-01-19 18:52:40

标签: java rest spring-mvc

我正在映射网址/modules/tips/SOME_ID/small以访问ID为SOME_ID的提示,并使用视图small.jsp呈现它。以下代码适用于此,但我被迫在两个地方重复字符串modules/tips。 Spring MVC似乎没有我可以确定的约定。除了使用常量之外,还有更好的方法来减少这种重复吗?

@Controller
public class TipsController{

  @RequestMapping(value="/modules/tips/{tipId}/{viewName}",method=RequestMethod.GET)
  public ModelAndView get(
    @PathVariable String tipId,
    @PathVariable String viewName) {
    Tip tip = findTip(tipId);
    return new ModelAndView("modules/tips/" + viewName,"tip",tip);
  }
}

4 个答案:

答案 0 :(得分:1)

您认为名称映射逻辑看起来太“自定义”,因此Spring几乎无法为其提供一些内置支持。 Hovewer,作为理论上的可能性,您可以实现自定义ModelAndViewResolver并在AnnotationMethodHandlerAdapter

中注册

答案 1 :(得分:0)

只要您的观看次数与您的网址相符,您就可以通过简单地省略视图名称来执行您要执行的操作。如果您不提供视图名称,Spring将使用RequestToViewNameTranslator来尝试找出视图名称。您可以查看该类的源代码,以确切了解它的工作原理。以下是文档中的一句好话:

“...'http://localhost/registration.html'的请求URL将导致DefaultRequestToViewNameTranslator生成逻辑视图名称'registration'。此逻辑视图名称将被解析为'/ WEB-INF /jsp/registration.jsp'由InternalResourceViewResolver bean查看。“

因此,它可以,例如,使得处理“/ modules / tips”的控制器方法默认尝试使用名为“modules / tips”的视图,可能你会在“/ WEB-”处有一个JSP INF / JSP /模块/ tips.jsp”。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-coc-r2vnt

编辑:我刚刚注意到你说你试图省略视图名称,看起来似乎没有用。您始终可以编写自己的RequestToViewNameTranslator实现,并将DefaultRequestToViewNameTranslator替换为您自己的自定义实现。检查文档,了解如何注入自己的翻译器。

答案 2 :(得分:0)

如果您将web.xml中的<url-pattern>元素更改为包含modules/tips,则可以从所有Spring绑定配置中有效地省略它:

<servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/myapp/modules/tips/*</url-pattern>
</servlet-mapping>


@RequestMapping(value="/{tipId}/{viewName}",method=RequestMethod.GET)
public ModelAndView get(
    @PathVariable String tipId,
    @PathVariable String viewName) {
    Tip tip = findTip(tipId);
    return new ModelAndView(viewName,"tip",tip);
}

答案 3 :(得分:-1)

您可以在班级上添加@requestMappings注释。然后,方法上的@requestMapping注释与此相关:

@Controller
@RequestMapping(value="/modules/tips")
public class TipsController{

    @RequestMapping(value="{tipId}/{viewName}",method=RequestMethod.GET)
    public ModelAndView get(
        @PathVariable String tipId,
        @PathVariable String viewName) {
        Tip tip = findTip(tipId);
        return new ModelAndView("modules/tips/" + viewName,"tip",tip);
    }
}