Несколько ресурсов в одном RequestMapping - PullRequest
0 голосов
/ 22 сентября 2019

Проблема:

Я пытаюсь получить несколько ресурсов в одном сопоставлении контроллера.Мне нужно взять эти ресурсы и использовать для доступа к данным в 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"
}

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Если количество ресурсов будет расти, увеличится и длина вашего URL.

В таких случаях вы можете рассмотреть возможность отправки данных запроса в теле запроса через запрос POST.

0 голосов
/ 22 сентября 2019

Я предлагаю вам сделать это:

    @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 :)
}

Я надеюсь, что это полезно, пожалуйста, проверьте этот ответ: @ PJMeisch answer

если вы попробуете yourdomain.com/users/keys:k1/k2/k3
массив 'keys' будет содержать: ["k1","k2","k3"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...