Миграция Spring Roo веб-mvc в gvNIX datatables: как фильтровать записи?

Один из вариантов использования - показать зарегистрированному пользователю только его / ее собственные платежи, а не все платежи.

В представлении "старый веб-mvc scaffold" я нажал на метод list и изменил его, чтобы получить все записи о платежах текущего зарегистрированного пользователя, см. Код ниже.

Теперь я хочу перейти на таблицы данных gvNIX. По умолчанию он показывает все записи в базе данных.

Вопрос: как я могу отфильтровать только записи этого пользователя?
Простым примером будет отличная документация.

@RequestMapping(produces = "text/html")
public String list(@RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @RequestParam(value = "sortFieldName", required = false) String sortFieldName, @RequestParam(value = "sortOrder", required = false) String sortOrder, Model uiModel) {
    System.out.println("In payment list controller");
    if (page != null || size != null) {
        int sizeNo = size == null ? 10 : size.intValue();
        final int firstResult = page == null ? 0 : (page.intValue() - 1) * sizeNo;
        //  uiModel.addAttribute("payments", Payment.findPaymentEntries(firstResult, sizeNo, sortFieldName, sortOrder));
        User currentUser = getCurrentUser();
        List<Payment> paymentList = Payment.findPaymentsByPayUser(getCurrentUser(), firstResult, sizeNo, "transactionDate", "DESC");
        uiModel.addAttribute("payments", paymentList);
        float nrOfPages = (float) Payment.countFindPaymentsByPayUser(currentUser) / sizeNo;
        uiModel.addAttribute("maxPages", (int) ((nrOfPages > (int) nrOfPages || nrOfPages == 0.0) ? nrOfPages + 1 : nrOfPages));
    } else {
        //  uiModel.addAttribute("payments", Payment.findAllPayments(sortFieldName, sortOrder));
        uiModel.addAttribute("payments", Payment.findPaymentsByPayUser(getCurrentUser(), "transactionDate", "DESC").getResultList());
    }
    addDateTimeFormatPatterns(uiModel);
    return "payments/list";
}

    private User getCurrentUser() {
    //  Retrieve the current logged in user and his authentication
    String username = SecurityContextHolder.getContext().getAuthentication().getName();
    //  Retrieve the user object of the current user
    User user = User.findUsersByEmailAddress(username).getSingleResult();
    return user;
}

1 ответ

Решение

Поскольку Datatables использует Ajax-запрос для извлечения данных, list Метод используется так же, как ящик страницы (это делается declare precedence Директива AspectJ о _Roo_GvNIXDatatables.aj).

Чтобы настроить данные, получаемые с помощью Datatables, вы должны нажать setDatatablesBaseFilter, Вы можете найти его в _Roo_GvNIXDatatables.aj файл. Вы можете попробовать что-то вроде этого в вашем контроллере:

public void setDatatablesBaseFilter(Map<String, Object> propertyMap) {
    // Add here your baseFilters to propertyMap.
    propertyMap.put("paymentUser", getCurrentUser());
}

Если вам нужен более сложный фильтр, вы должны настроить findAllXXX а также retrieveData методы (первый для визуализации данных и второй для функции экспорта).

Удачи!

Другие вопросы по тегам