Несколько параметров запроса get @PathVariable и @RequestAttribute с Micronaut? - PullRequest
0 голосов
/ 10 июля 2019

В моем контроллере есть функция get с различными параметрами:

myinterface.java :

public interface MyInterface {

   @Get(value = "/bob/{name}/params?surname={surname}")
   String getMyParam (
   @Parameter(name="name", required=true)
   @PathVariable("name") String name, 
   @NotNull 
   @Parameter(name="surname", required=true) 
   @Valid 
   @RequestAttribute(value="surname") String surname) {

   }
}

mycontroller.java :

public class MyController implements MyInterface {

   @Override
   public String getMyParam(String name, String surname) { return name + surname; }
}

Но когда я звоню "http://localhost:8080/bob/marley/params?surname=lion", отправляется СООБЩЕНИЕ ОБ ОШИБКЕ: Страница не найдена.

Когда я работаю с дополнительными параметрами /books{?max,offset}, этоработать. Я что-то пропустил?

Можно ли смешивать PathVariable и RequestAttribute при выполнении запросов?

РЕДАКТИРОВАТЬ 1

Когда я удаляю ?surname=={surname} из значения @Get возникает «HttpClientResponseException: Требуется аргумент [Фамилия строки] не указан».

1 Ответ

0 голосов
/ 17 июля 2019

surname в вашем случае это не атрибут запроса, а значение запроса (параметр). Поэтому используйте @QueryValue аннотацию вместо @RequestAttribute и не указывайте ее в шаблоне URL.

Таким образом, реализация контроллера может выглядеть так:

@Controller
public class MyController {
    @Get(value = "/bob/{name}/params")
    String getMyParam(String name, @QueryValue String surname) {
        return name + surname;
    }
}

Другое дело, что аннотация @NotNull для параметра surname является избыточной. Этот параметр является обязательным по умолчанию. Если вы хотите, чтобы он был необязательным, он должен иметь тип Optional, например:

@Get(value = "/bob/{name}/params")
String getMyParam(String name, @QueryValue Optional<String> surname) {
    return name + surname.orElse("");
}
...