spring Sping Boot 中的路径继承和统一路径变量验证

bkhjykvo  于 2023-11-16  发布在  Spring
关注(0)|答案(1)|浏览(174)

我正在构建一个API,它具有以下结构:

/projects/{project-name}/a/...
/projects/{project-name}/b/...
/projects/{project-name}/c/...
/projects/{project-name}/d/...

字符串
我希望a,B,c,d的逻辑在它们自己的控制器上被覆盖。此外,在每个请求上,我希望验证{project-name}变量并在请求上注入一个属性,该属性将包含一个项目实体。
我绝对想避免在每个控制器上检查项目。
有什么想法可以实现这一点吗?据我所知,Sping Boot 上的路径继承是不可能的(我真的很想拥有其他框架提供的继承,比如RESTEasy)。
到目前为止,我唯一的想法是使用过滤器,但我更喜欢MVC/Webflux级别的解决方案。
我用的是Sping Boot 3。
任何建议都很感激。

6jygbczu

6jygbczu1#

方法

1.编写一个基接口,并使用@RequestMapping注解所需的基路径。
1.编写带有@Controller注解的实现,但不带@RequestMapping(这样基本路径就不会被覆盖)
1.对于验证,使用过滤器方法本身。


的数据

BaseController接口

@RequestMapping( "/projects/{project-id}" )
public interface BaseController {
}

字符串

子控件示例

(You可以写任何数字,只要方法上的最终路径不重复。

@Controller
public class ChildController implements BaseController{
    /* Add your controller method with the rest of the path */
    @RequestMapping( "/a/{id}" )
    public ResponseEntity<String> a( @PathVariable( "project-id" ) String projectId, @PathVariable( "id" ) String id ){
        /* You will get the path variable 'project-id' also */
        System.out.println( "/a: Path param project-id: " + projectId + ", Path param id: " + id );
        return ResponseEntity.ok( "Returned from /a" );
    }

    /* Add another controller method if you need to */
    @RequestMapping( "/b" )
    public ResponseEntity<String> b(){
        System.out.println( "/b" );
        return ResponseEntity.ok( "Returned from /b" );
    }
}

**注意:**以上代码是用Java 11和SpringBoot 2.7.4测试的,我想它使用的是Spring MVC 5.2.x。

使用@ModelAttribute验证project-id

(基于此this question的答案)
如果我们不想使用过滤器(尽管我随时都会使用),我们可以在基接口中添加一个带有@ModelAttribute注解的方法,该方法将在每个端点方法之前被调用。尽管@ModelAttribute的文档没有明确说明,但它无论如何都会被调用。我们可以在BaseController中对此方法进行以下更改。

@RequestMapping( "/projects/{project-id}" )
public interface BaseController {
    @ModelAttribute
    default void interceptMVCMethod( HttpServletRequest req, @PathVariable( "project-id" ) String projectId ){
        System.out.println( "ModelAttribute: " + projectId );
        req.setAttribute( "NAME", "DEV-1" );
    }
}

相关问题