首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >配置控制器,使可选排序器可以根据控制器的输入启用/禁用

配置控制器,使可选排序器可以根据控制器的输入启用/禁用
EN

Stack Overflow用户
提问于 2020-05-15 11:22:29
回答 4查看 279关注 0票数 0

我正在尝试编写一个端点,允许在后端使用可选的排序器。

例如,我有一个排序器,允许我根据元素的创建日期对列表中的元素进行排序--这是我的端点控制器返回的内容。

如果相应的控制器参数是true,则从最新开始对元素进行排序,并向最老的方向移动。

如果对应的参数是false,则相反。

这是一个Spring项目。

,我想知道是否有更适合春天的方法来实现这一点?

这是我的控制器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class StudentsController{
    @Autowired
    private GradeBook yearlyGrades;

    @GetMapping("/successful")
    public List<Student> getSuccessfulStudents(
        @RequestParam(name = "startDate") Instant startDate,
        @RequestParam(name = "endDate") Instant endDate,
        @RequestParam(defaultValue = "false", required = false) boolean sortStartingFromHighestGrade,
        @RequestParam(defaultValue = "false", required = false) boolean sortStartingFromEarliestDate) {


        return this.yearlyGrades.getSuccessfulStudents(startDate, endDate, 
                                                       sortStartingFromHighestGrade, 
                                                       sortStartingFromEarliestDate);
    }
}

取决于最后两个参数的true/false值:

sortStartingFromHighestGrade sortStartingFromEarliestDate

在服务类的背景中会发生不同的处理。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-21 05:46:38

在这里,Spring可以以多种方式提供帮助:

  1. 从Spring的角度来看,您不必在单独的变量中提供所有请求参数,而是可以用所有这些参数定义一个类,spring将为您映射它们:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

然后,在您的控制器中,您可以执行以下操作,IMHO看起来更干净:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping
public Page<Student> getSuccessfulStudents(Params params) {
   ...
}

正如@nazar_art所提到的,如果您有spring数据,您可以使用spring数据的可访问性支持,否则您必须自己实现它,这也不是什么大事。

票数 0
EN

Stack Overflow用户

发布于 2020-05-17 12:53:08

您可以使用spring实现带有可寻呼支持的排序。

您将创建一个Pageable对象,用于从DB获取数据。

您可以将PagingAndSortingRepository用于Spring数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface StudentRepository extends PagingAndSortingRepository<Student, Integer> {

并在服务层为您的实体调用带有任意排序选项的常规.findAll(pageable)

你的控制器看起来就像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping
public Page<Student> getSuccessfulStudents(
        @RequestParam(name = "startDate") Instant startDate,
        @RequestParam(name = "endDate") Instant endDate,
        @RequestParam(value = "page", required = false, defaultValue = "0") int page,
        @RequestParam(value = "size", required = false, defaultValue = "10") int size) {
    return yearlyGrades.getSuccessfulStudents(startDate, endDate,
                 PageRequest.of(page, size, Sort.by("propertyFromClass")));
}

如果不想返回Page<Entity>,可以将其转换为服务层的列表。

更新:

您可以通过直接传递对象,而不是通过PageRequest.of()创建可访问的PageRequest.of()对象:

/successful?page=0&size=10&sort=grade

其中grade是来自学生类的字段。

/successful?page=0&size=10&sort=grade,问

Pageable内部识别的所有参数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

那么您的控制器应该是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping("/successful")
public Page<Student> getSuccessfulStudents(
    @RequestParam(name = "startDate") Instant startDate,
    @RequestParam(name = "endDate") Instant endDate,
    Pageable pageable) {
    return yearlyGrades.getSuccessfulStudents(startDate, endDate, pageable);
}

有用的参考资料:

票数 3
EN

Stack Overflow用户

发布于 2020-05-23 19:17:45

如果后端的处理确实不同,那么您可以使用相同的path定义不同的端点,但是可以使用不同的params字段来定义附加条件,请参阅@GetMapping注释文档和为具有不同参数的相同url模式创建两种方法中的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61826833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文