原创 多种URL(参数不同)指向同一个Controller中的同一个方法

有时我们需要在已经存在的接口上添加参数,
但又不能影响现有的接口(因为前端没空适配),
同样的代码再复制出来一份的话存在太多的冗余,
同样一个Controller 下的一个方法 搞出来两个同时使用的接口?怎么办?
而且两个接口参数还不一样?怎么办?
要写在一块参数还数量不一样还不能相互影响?怎么办?

例如:现有一个下边的接口:

@RequestMapping(value = "/demo/{id}",method = RequestMethod.GET)
public void get(@PathVariable("id")Integer id){

// 处理业务
}

我们需要添加 另外一个URI 为/demo/{id}/other/{param},
实现访问/demo/{id} 跟 /demo/{id}/otherParam/{param}
进入同一个方法,完成同一个业务

解决办法:@RequestMapping的value数组形式 + @PathVariable(required = false) 代码如下:

@RequestMapping(value = {"/demo/{id}","/demo/{id}/otherParam/{param}"},method = RequestMethod.GET)
public void get(@PathVariable("id")Integer num,@PathVariable(required = false) Integer param){

// 处理业务
}

关键讲解:

当使用@RequestMapping URI template 样式映射时, 即 /demo/{id}, 这时的id可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable(“name”)指定uri template中的名称。

由 required() 注释可知,该参数代表着:是否需要path变量。默认为 true,如果在传入的请求中缺少路径变量,则会导致异常。

关键点:当某个参数可有可无时,我们设置为 required = false,如果不设置该参数,在调用/demo/id 这个接口时,会报

org.springframework.web.bind.MissingPathVariableException:
Missing URI template variable 'param' for method parameter of type Integer


PathVariable 源码如下:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {

    /**
     * Alias for {@link #name}.
     */
    @AliasFor("name")
    String value() default "";

    /**
     * The name of the path variable to bind to.
     * @since 4.3.3
     */
    @AliasFor("value")
    String name() default "";

    /**
     * Whether the path variable is required.
     * <p>Defaults to {@code true}, leading to an exception being thrown if the path
     * variable is missing in the incoming request. Switch this to {@code false} if
     * you prefer a {@code null} or Java 8 {@code java.util.Optional} in this case.
     * e.g. on a {@code ModelAttribute} method which serves for different requests.
     * @since 4.3.3
     */
    boolean required() default true;

}
本文为 Laysonx 原创 文章,转载无需和我联系,但请注明来自 李鑫的杂货铺 或 李鑫博客