单个RequestMapping中包含多个资源

时间:2019-09-21 23:27:09

标签: spring spring-boot spring-mvc

问题:

我正在尝试在控制器的单个映射中接收多个资源。我需要利用这些资源来访问MongoDB中的数据。

示例:

如果访问权限位于: mydomain.com/rootresource/datakey1/datakey2
我想在 rootresource 之后获取资源,以用于在MongoDB中搜索数据。 rootresource 之后的资源数量不是固定的。


我的实际控制人:

@RestController
@RequestMapping("users")
public class UserController {

    @Autowired
    private UserService service;

    @PostMapping
    public void create(@RequestBody UserCreateRequest request) {
        service.create(request.getAccess(), request.getPassword(), request.getData());
    }

    @GetMapping("/{access}")
    public UserDTO readByAccess(@PathVariable("access") String access) {
        return service.read(access);
    }

    @GetMapping("/{data:[\\/.]*}")
    public Document readByAccessAndData(@PathVariable("data") String data) {
        return null;
    }

}

我的实际尝试是在readByAccessAndData函数中。当我调用网址.../users/key1/key2时,收到的错误是:

{
    "timestamp": "2019-09-21T22:22:31.262+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/users/key1/key2"
}

2 个答案:

答案 0 :(得分:0)

我建议您这样做:

    @GetMapping("keys:**/**")
public Document readByAccessAndData(HttpServletRequest request) {

String path = request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();

String matchingPattern = request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)
            .toString();

String arguments = new AntPathMatcher().extractPathWithinPattern(bestMatchingPattern, path);

arguments = arguments.replace("keys:","");//ignore the word 'keys:'.

String[] keys = arguments.split("/");

//now use keys to do whatever you want

//return whatever you want :)
}

我希望它有用,请检查以下答案:@P.J.Meisch answer

如果您尝试yourdomain.com/users/keys:k1/k2/k3
数组“键”将包含:["k1","k2","k3"]

答案 1 :(得分:0)

如果资源数量将增加,那么URL的长度也会增加。

在这种情况下,您可能需要考虑通过POST请求在请求的正文中发送查询数据。