我正在尝试编写一个端点,允许在后端使用可选的排序器。
例如,我有一个排序器,允许我根据元素的创建日期对列表中的元素进行排序--这是我的端点控制器返回的内容。
如果相应的控制器参数是true
,则从最新开始对元素进行排序,并向最老的方向移动。
如果对应的参数是false
,则相反。
这是一个Spring项目。
,我想知道是否有更适合春天的方法来实现这一点?。
这是我的控制器:
@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
在服务类的背景中会发生不同的处理。
发布于 2020-05-21 05:46:38
在这里,Spring可以以多种方式提供帮助:
public class Params {
private Instant startDate;
private Instant endDate;
private int page = 0;
private int size = 10;
... constructor/getters/setters ...
}
然后,在您的控制器中,您可以执行以下操作,IMHO看起来更干净:
@GetMapping
public Page<Student> getSuccessfulStudents(Params params) {
...
}
正如@nazar_art所提到的,如果您有spring数据,您可以使用spring数据的可访问性支持,否则您必须自己实现它,这也不是什么大事。
发布于 2020-05-17 12:53:08
您可以使用spring实现带有可寻呼支持的排序。
您将创建一个Pageable对象,用于从DB获取数据。
您可以将PagingAndSortingRepository
用于Spring数据:
public interface StudentRepository extends PagingAndSortingRepository<Student, Integer> {
并在服务层为您的实体调用带有任意排序选项的常规.findAll(pageable)
。
你的控制器看起来就像:
@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内部识别的所有参数如下:
page - Page number
size - Page Size
sort - sort by (Order by)
direction - ASC / DESC
那么您的控制器应该是:
@GetMapping("/successful")
public Page<Student> getSuccessfulStudents(
@RequestParam(name = "startDate") Instant startDate,
@RequestParam(name = "endDate") Instant endDate,
Pageable pageable) {
return yearlyGrades.getSuccessfulStudents(startDate, endDate, pageable);
}
有用的参考资料:
发布于 2020-05-23 19:17:45
如果后端的处理确实不同,那么您可以使用相同的path
定义不同的端点,但是可以使用不同的params
字段来定义附加条件,请参阅@GetMapping
注释文档和为具有不同参数的相同url模式创建两种方法中的示例。
https://stackoverflow.com/questions/61826833
复制相似问题