Spring MVC 是否有更好的方法通过REST API提供过滤功能?

pftdvrlh  于 2022-11-14  发布在  Spring
关注(0)|答案(2)|浏览(106)
@GetMapping
  public ResponseEntity<Page<CsatSurveyModel>> getAllSurveys(
      @RequestParam(required = false) String teamName,
      @RequestParam(required = false) String customerName,
      @RequestParam(required = false) Integer year,
      @RequestParam(defaultValue = "id") String orderBy,
      @RequestParam(defaultValue = "DESC") Direction direction,
      @RequestParam(defaultValue = AppConstant.DEFAULT_PAGE) int page,
      @RequestParam(defaultValue = AppConstant.DEFAULT_PAGE_SIZE) int size) {
    Sort sort = Sort.by(direction, orderBy);
    Pageable pageRequest = PageRequest.of(page, size, sort);

    Specification<CsatSurvey> csatSurveySpecification = Specification.where(null);

    if (Objects.nonNull(teamName)) {
      csatSurveySpecification = csatSurveySpecification.and(CsatSurvey.teamNameSpec(teamName));
    }
    if (Objects.nonNull(customerName)) {
      csatSurveySpecification =
          csatSurveySpecification.and(CsatSurvey.customerNameSpec(customerName));
    }
    if (Objects.nonNull(year)) {
      csatSurveySpecification = csatSurveySpecification.and(CsatSurvey.yearSpec(year));
    }

    UserModel loggedInUser = sessionUtils.getLoggedInUser();
    List<Team> teams =
        UserRole.ADMIN.equals(loggedInUser.getRole())
            ? Collections.emptyList()
            : loggedInUser.getTeams();
    Page<CsatSurveyModel> csatSurveyModels =
        csatService.getAllSurveysForTeams(teams, csatSurveySpecification, pageRequest);
    return ResponseEntity.ok(csatSurveyModels);
  }

前三个参数是用于过滤的目的与规范。其余的是为页面请求。我想知道是否有一个更好的方法来做到这一点。有很多的代码在控制器中,即使我想把处理移动到服务层,该方法将不得不接受一个很长的参数列表,我不想这样做。虽然这个方法只接受七个参数,还有其他接受十个以上参数的路由。
我知道一种方法是将所有这些参数都作为Map<String, String>接受,但是处理它是不是有点乏味?

jtoj6r0c

jtoj6r0c1#

我的方法是使用请求类。
这样做的好处是,您可以在不更改控制器和服务的方法签名的情况下更改参数(假设您也将请求对象传递给服务)。

public UserDataResponse getUserData(@RequestBody UserDataRequest userDataRequest)

其中UserDataRequest是一个简单的类,包含getter和setter。

class UserDataRequest {
  private String paramA;
  private String paramB;

  public String getParamA() {
    return paramA;
  }
}

等等。

5m1hhzi4

5m1hhzi42#

Spring MVC可以直接将Pageable(或Sort)作为控制器参数,Spring Data可以接受一个作为查询参数。

相关问题