【问题标题】:Multiple resources in a single RequestMapping单个 RequestMapping 中的多个资源
【发布时间】:2020-01-22 11:41:51
【问题描述】:

问题:

我正在尝试在控制器的单个映射中接收多个资源。我需要获取这些资源并用于访问 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 函数中。当我调用 url .../users/key1/key2 时,收到的错误是:

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

【问题讨论】:

  • 所以当你有请求时:mydomain.com/rootresource/datakey1/datakey2 你想查询 MangoDB 以获取 user1 和 user2 信息对吗?我认为要实现这一点,您需要有一个我现在在控制器中没有看到的 @RequestMapping(“rootresouce”)。

标签: spring spring-boot spring-mvc


【解决方案1】:

我建议你这样做:

    @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
数组“keys”将包含:["k1","k2","k3"]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多