Διαμορφώστε τον ελεγκτή με τρόπο ώστε οι προαιρετικοί ταξινομητές να μπορούν να ενεργοποιηθούν / απενεργοποιηθούν με βάση την είσοδο του ελεγκτή

ψήφοι
43

Προσπαθώ να γράψω ένα τελικό σημείο που επιτρέπει τη χρήση προαιρετικών ταξινομητών στο backend.

Για παράδειγμα, έχω έναν ταξινομητή που μου επιτρέπει να ταξινομήσω στοιχεία σε μια λίστα - την οποία επιστρέφει ο ελεγκτής του τελικού σημείου μου - με βάση την ημερομηνία δημιουργίας τους. Εάν η αντίστοιχη παράμετρος ελεγκτή είναι αληθής τότε τα στοιχεία ταξινομούνται ξεκινούν από το νεότερο και κινούνται προς το παλαιότερο. Εάν η αντίστοιχη παράμετρος είναι ψευδής, τότε το αντίθετο.

Αυτό είναι ένα έργο Spring Boot.

Αναρωτιόμουν αν υπάρχει ένας πιο κατάλληλος τρόπος για να το επιτύχετε αυτό;

Αυτός είναι ο ελεγκτής μου:

@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);
    }
}

Ανάλογα με την πραγματική / λάθος τιμή των δύο τελευταίων παραμέτρων sortStartingFromHighestGrade και sortStartingFromEarliestDate , διαφορετική επεξεργασία συμβαίνει στο παρασκήνιο στην κλάση υπηρεσίας.

Δημοσιεύθηκε 15/05/2020 στις 21:22
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
0

Θα μπορούσατε να εφαρμόσετε ταξινόμηση με ελατήριο με υποστήριξη Pageable .

Θα δημιουργήσετε ένα αντικείμενο Pageable για λήψη των δεδομένων από το DB.

Πρέπει να χρησιμοποιήσετε PagingAndSortingRepository για Spring Data:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, 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> θα μπορούσατε να το μετατρέψετε σε Λίστα στο επίπεδο υπηρεσίας.

ΕΚΣΥΓΧΡΟΝΙΖΩ:

Αντί για δημιουργία αντικειμένου Pageable από PageRequest.of() , θα μπορούσατε να το μεταβιβάσετε απευθείας με διεύθυνση URL:

/ επιτυχής? σελίδα = 0 & μέγεθος = 10 & είδος = βαθμός

όπου grade είναι ένα πεδίο από την τάξη των μαθητών .

ή

/ επιτυχής? σελίδα = 0 & μέγεθος = 10 & είδος = βαθμός, ρωτήστε

Όλες οι παράμετροι αναγνωρίζονται εσωτερικά από το Pageable ως εξής:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Τότε ο ελεγκτής σας πρέπει να είναι:

@GetMapping("/successful")
public List<Student> getSuccessfulStudents(
    @RequestParam(name = "startDate") Instant startDate,
    @RequestParam(name = "endDate") Instant endDate,
    Pageable pageable) {
    return yearlyGrades.getSuccessfulStudents(startDate, endDate, pageable);
}

Χρήσιμες αναφορές:

Απαντήθηκε 17/05/2020 στις 22:53
πηγή χρήστη

ψήφοι
0

Η άνοιξη μπορεί να είναι βολική με πολλούς τρόπους εδώ:

  1. Από την άποψη του Spring MVC δεν χρειάζεται να παρέχετε όλες τις παραμέτρους αιτήματος σε ξεχωριστές μεταβλητές. Αντ 'αυτού, μπορείτε να ορίσετε μια κλάση με όλες αυτές τις παραμέτρους και το ελατήριο θα τις χαρτογραφήσει για εσάς:
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, μπορείτε να χρησιμοποιήσετε τη δυνατότητα υποστήριξης του Pageable των εαρινών δεδομένων, εάν έχετε δεδομένα άνοιξη. Διαφορετικά, θα πρέπει να τα εφαρμόσετε μόνοι σας, κάτι το οποίο δεν είναι μεγάλο ζήτημα.

Απαντήθηκε 21/05/2020 στις 15:46
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more