Вариант использования для разбиения на страницы встроенных ресурсов

Есть вариант использования, который я борюсь с SDR, как показано ниже:

Есть таблица User Table и таблицы RefSecQuestion

User -> ManyTOOne -> RefSecQuestion , RefSecQuestion -> OneToMany -> User

Есть таблица User Table и таблицы UserFriends

User -> OneToMany UserFriends , UserFriends -> ManyToOne -> User

Существует требование, чтобы при переходе /users/{id}/userFriends по умолчанию отображались имя, фамилия и т. д. из UserProjection.

В результате я включил excerptProjection в UserRepository, и он отлично работает. Я ожидаю около 100 результатов, так что это нормально, если этот результат не разбит на страницы.

Но теперь, поскольку RefSecQuestion также связан с User , происходит следующее: когда я иду /refSecQuestions -> эта страница зависает, поскольку она пытается заменить ссылку пользователя на UserProjection. Таблица RefSecQuestion искажена одним вопросом для большинства пользователей, поэтому страница разрывается из-за потери нумерации страниц.

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

/users/{id}/userFriends
/refSecQuestions/users  

Ближайший ответ, который я нашел, заключался в том, чтобы выбрать однонаправленность, то есть я установил для Rest Export значение false для пользователя в RefSEcQuestion.


person fortm    schedule 18.12.2014    source источник
comment
Вы уже знаете ответ: stackoverflow.com/questions/24775583/   -  person a better oliver    schedule 19.12.2014
comment
@zeroflagL, да, я видел ответ Оливера и не могу реализовать его слова. Можете ли вы дать некоторые рекомендации здесь. Я понял, как настроить SDR для ExposeIdOnly, и после этого не понимаю, как вручную сохранять URL-адрес одинаковым   -  person fortm    schedule 19.12.2014
comment
Я не совсем уверен, но я думаю, что под «открыть ресурс вручную» он подразумевает написание контроллера Spring MVC.   -  person a better oliver    schedule 19.12.2014
comment
Я использую Spring Security. Я настроил его так, чтобы все URL-адреса /users/{id}/* были доступны только пользователю, вошедшему в систему с {id}. ТЕПЕРЬ, поскольку эта разбивка на страницы не работает из коробки, и теперь я должен выставлять /profile ,/userLanguages ​​отдельно, разработать стратегию безопасности Spring сложнее, поскольку количество идентификаторов увеличивается. Поэтому искал решение, в котором используется Spring Data Трюк JPA может дать тот же результат с использованием Spring MVC   -  person fortm    schedule 19.12.2014
comment
Я также посмотрел здесь, и кажется, что здесь предлагается создать собственный метод поиска, однако затем URL-адрес изменится, поскольку в нем будет /search stackoverflow.com/questions/21469538/   -  person fortm    schedule 19.12.2014
comment
stackoverflow.com/questions/27013726/ ‹- я подозреваю, что это то, что предлагается, где мы можем сначала сделайте остаточный вызов Embedded Resouce и получите IDS, а затем запустите вышеуказанный запрос   -  person fortm    schedule 19.12.2014


Ответы (1)


Наконец-то я могу получить желаемые результаты и пишу здесь для всех пользователей SDR. Я хотел иметь разбиение на страницы в этом URL-адресе - где Пользователь -> Один ко многим -> UserLanguages

/users/{id}/userLanguages

Теперь, используя конфигурацию SDR по умолчанию, встроенные ресурсы не разбиваются на страницы, и поэтому мне приходится вручную раскрывать их, а обходной путь приведен ниже, который по-прежнему занимает очень меньше строк кода:

@RestController
public class MainController {

    @RequestMapping(value = "/users/{id}/userLanguages", method = RequestMethod.GET)
    @PreAuthorize("permitAll")
    public ModelAndView findUserLanguages(@PathVariable Integer id) {
        ModelAndView model = new ModelAndView("forward:/userLanguages/search/findByUserId?userId=" + id);
        return model;
    }

затем в UserLangRepository

public interface UserLanguageRepository extends BaseRepository<UserLanguage, Integer> {

    Page<UserLanguage> findByUserId(@Param("userId") Integer userId, Pageable pageable);
}

Здесь имя findByUserId соответствует правилу вывода Spring Data Query, где есть столбец пользователя в UserLanguage и столбец идентификатора в User. Затем следующий URL-адрес разбит на страницы и имеет другие параметры, такие как сортировка, размер и т. Д.

http://localhost:8585/MYAPP/users/3/userLanguages

Однако существует проблема, связанная с тем, что следующая и предыдущая ссылки указывают на перенаправленную ссылку.

person fortm    schedule 21.12.2014
comment
Это сработало для меня, я хотел бы найти другое решение, если это возможно, но на данный момент это решает проблему, спасибо! - person Hatem Jaber; 21.03.2017