我正在尝试在控制器的单个映射中接收多个资源。我需要利用这些资源来访问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"
}
答案 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
请求在请求的正文中发送查询数据。