Spring请求映射到特定路径变量值的不同方法

Posted

技术标签:

【中文标题】Spring请求映射到特定路径变量值的不同方法【英文标题】:Spring request mapping to a different method for a particular path variable value 【发布时间】:2015-09-28 11:27:51 【问题描述】:
@Controller
@RequestMapping("/authors")
public class AuthorController 
    @RequestMapping(value = "/id", method = RequestMethod.GET)
    public Author getAuthor(
        final HttpServletRequest request,
        final HttpServletResponse response,
        @PathVariable final String id)
    
        // Returns a single Author by id
        return null;
    

    @RequestMapping(value = "/id/author-properties", method = RequestMethod.GET)
    public AuthorProperties getAuthorProperties(
        final HttpServletRequest request,
        final HttpServletResponse response,
        @PathVariable final String id)
    
        // Returns a single Author's List of properties
        return null;
    

    @RequestMapping // How to map /authors/*/author-properties to this method ????
    public List<AuthorProperties> listAuthorProperties(
        final HttpServletRequest request,
        final HttpServletResponse response)
    
        // Returns a single Author's List of properties
        return null;
    


class Author 
    String propertiesUri;
    // other fields


class AuthorProperties 
    String authorUri;
    // other fields

基本上我需要:

/authors - 列出所有作者 /authors/123 - 通过 id 123 获取作者 /authors/123/author-properties - 获取 123 作者的 AuthorProperties 对象 /authors/*/author-properties - 获取所有作者的 AuthorProperties 列表

当我尝试时

@RequestMapping(value = "/*/author-properties", method = RequestMethod.GET)

它仍在将/authors/*/author-properties 映射到getAuthorProperties 方法,路径变量值为“*”。

【问题讨论】:

当我将 /*/author-properties 的方法保留在 /id/author-properties 的方法之前,它就开始工作了。那么这是一个适当的解决方案吗?我们是否可以始终将映射的处理顺序作为方法声明的顺序进行传递? 【参考方案1】:

看看这是否有效

@RequestMapping(value = "/id:.*/author-properties", method = RequestMethod.GET)

【讨论】:

【参考方案2】:

您可以使用正则表达式限制单个作者的映射,例如:

@RequestMapping("/authorId:\\d+/author-properties")
public String authorProperties(@PathVariable String authorId) 

这只会匹配作者 ID 为数字的 URL。

对于您可以使用的所有作者属性的请求:

@RequestMapping("/*/author-properties")
public String allProperties()  

Hovewer * 具有特殊含义,因此它也将匹配 /foo/author-properties。要解决它,您可以使用以下内容:

@RequestMapping("/all:\\*/author-properties")
public String allProperties()  

【讨论】:

【参考方案3】:

如果为所有作者获取 AuthorProperties 列表是常见的情况,那么我认为您应该创建一个这样的 URI:“/author-properties”。否则 Bohuslav 给出的答案就是你想要的。

【讨论】:

以上是关于Spring请求映射到特定路径变量值的不同方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring Web MVC:对请求参数和路径变量使用相同的请求映射

MFC 随变量变化在不同静态编辑框输出变量值

Seajs的使用

如何在javascript中的不同html页面之间传递变量值

无法在 Java 8 中设置实例变量值

Spring MVC 3.0:如何有效地验证对所有请求映射都是全局的路径变量?