Spring @RequestMapping с необязательными параметрами при использовании пользовательского объекта запроса - PullRequest
0 голосов
/ 04 февраля 2020

Здравствуйте. Я хочу сделать необязательный параметр на моем контроллере, id, который пока выглядит следующим образом

    @ApiOperation(value = "get runs by date in order to paginate")
    @ApiResponses({ @ApiResponse(code = 200, message = "Success"),
            @ApiResponse(code = 500, message = "Unexpected failure") })
    @RequestMapping(value = "/time/{date}/to/{toPage}/from/{fromPage}",
                    params = {"pageSize", "id"},
                    method = RequestMethod.GET)
    public RunCollection getPolicyByDate(GetPolicyByDateRequest request) {
        return serviceImpl.getListOfRunsByDate(request);
    }

Но это означает, что параметр является обязательным. Я хочу, чтобы это было необязательно. Я видел этот ответ, где они используют @RequestParam Spring @RequestMapping с необязательными параметрами , но я хочу включить его в мой GetPolicyByDateRequest объект. Это возможно? Весенние документы не намекают на отключение обязательного атрибута. Могу ли я использовать Optional

1 Ответ

0 голосов
/ 04 февраля 2020

2 варианта:

  1. Если ваш GetPolicyByDateRequest не имеет примитивного атрибута , они должны быть вставлены Spring в ваш объект. Если ваш параметр не установлен (т. Е. В вашем URL нет pageSize), тогда Spring добавляет в ваш атрибут NULL.
public class GetPolicyByDateRequest {

    private String date;
    private int toPage;
    private int fromPage;
    private Integer pageSize;
    private Integer id;

    public GetPolicyByDateRequest() {
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public int getToPage() {
        return toPage;
    }

    public void setToPage(int toPage) {
        this.toPage = toPage;
    }

    public int getFromPage() {
        return fromPage;
    }

    public void setFromPage(int fromPage) {
        this.fromPage = fromPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "MyRequest{" +
                "date='" + date + '\'' +
                ", toPage=" + toPage +
                ", fromPage=" + fromPage +
                ", pageSize=" + pageSize +
                ", id=" + id +
                '}';
    }
}

Странно, я думаю, что это какой-то король ошибки в Spring даже при использовании Optional вы получите пустой объект, если параметр в requestParam не указан.

Если вы хотите получить все параметры, вам нужно использовать @PathVariable с @RequestParam в вашем случае. Вот как получить ваши параметры:
 @RequestMapping(value = "/time/{date}/to/{toPage}/from/{fromPage}", method = RequestMethod.GET)
    public RunCollection getPolicyByDate(@PathVariable String date, @PathVariable int toPage, @PathVariable int fromPage, @RequestParam(required = false) Optional<Integer> pageSize, @RequestParam(required = false) Optional<Integer> id) {
        // then use your parameters the way you to use then.
    }

Обратите внимание:

  • @PathVariable извлекает параметр в URL, где значение находится в пределах {} Например, {date} -> @PathVariable String date
  • @RequestParam извлекает параметр после ? в URL. ?pageSize=10 -> @RequestParam int pageSize.
  • Обе эти аннотации принимают в качестве параметров, среди прочего, required=true|false. Когда вы помечаете параметр как необязательный, убедитесь, что вы не используете примитивный тип, например, int, в противном случае вы можете установить значение null для этого объекта, и ваш код потерпит неудачу во время выполнения. Это причина, почему я использовал Optional<Integer>, чтобы разрешить тип. Но Spring умный, и если он обнаруживает Optional в вашем параметре, то вы вынуждены использовать required=false в @RequestParam.

Если вы хотите заполнить ваш GetPolicyByDateRequest , тогда вы должны были сделать отображение POST и использовать аннотацию @RequestBody GetPolicyByDateRequest request и отправить тело JSON в своем запросе, чтобы Spring (фактически Джексон) преобразовал ваш JSON в GetPolicyByDateRequest объект.

Надеюсь, это поможет

...