Интеграция Spring Data REST с QueryDSL для запроса подсвойств сопоставления коллекции в сущности

Потребовалось немного покопаться, чтобы выяснить, что spring-data-rest с query-dsl позволяет клиентам REST API легко фильтровать большинство свойств объекта.

Этот вопрос также был полезен: Можно ли использовать интеграцию QueryDSL в Spring Data REST для выполнения более сложных запросов?

Как уже упоминал Деннис Лаумен, QueryDslPredicateExecutor и QuerydslBinderCustomizer предоставляют некоторые впечатляющие возможности, но не имеют документации.

Конкретная особенность, которую я пытаюсь взломать:

У меня есть объект User с отображением @ManyToMany на объект UserGroup

public class User {

    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "user_name")
    private String username;

    @ManyToMany
    @JoinTable(name = "fs_user_group_map", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "group_id") })
    private List<UserGroup> userGroups;
}

Я пытаюсь получить всех пользователей, одно имя их группы пользователей должно соответствовать тексту:

Итак, URI, который я пытаюсь использовать: /users?userGroups.name=Admin

Но это ошибка.

19:08:04.423|ERROR|o.s.d.r.w.RepositoryRestExceptionHandler|null
    java.lang.NullPointerException: null
    at org.springframework.util.ReflectionUtils.getField(ReflectionUtils.java:143) ~[spring-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.reifyPath(QuerydslPredicateBuilder.java:185) ~[spring-data-commons-1.11.2.RELEASE.jar:na]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.reifyPath(QuerydslPredicateBuilder.java:188) ~[spring-data-commons-1.11.2.RELEASE.jar:na]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.getPath(QuerydslPredicateBuilder.java:167) ~[spring-data-commons-1.11.2.RELEASE.jar:na]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.invokeBinding(QuerydslPredicateBuilder.java:136) ~[spring-data-commons-1.11.2.RELEASE.jar:na]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.getPredicate(QuerydslPredicateBuilder.java:111) ~[spring-data-commons-1.11.2.RELEASE.jar:na]
    at org.springframework.data.rest.webmvc.config.QuerydslAwareRootResourceInformationHandlerMethodArgumentResolver.postProcess(QuerydslAwareRootResourceInformationHandlerMethodArgumentResolver.java:91) ~[spring-data-rest-webmvc-2.4.2.RELEASE.jar:na]
    at org.springframework.data.rest.webmvc.config.RootResourceInformationHandlerMethodArgumentResolver.resolveArgument(RootResourceInformationHandlerMethodArgumentResolver.java:92) ~[spring-data-rest-webmvc-2.4.2.RELEASE.jar:na]
    at org.springframework.data.rest.webmvc.config.RootResourceInformationHandlerMethodArgumentResolver.resolveArgument(RootResourceInformationHandlerMethodArgumentResolver.java:40) ~[spring-data-rest-webmvc-2.4.2.RELEASE.jar:na]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:78) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969) [spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860) [spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) [javax.servlet-api-3.1.0.jar:3.1.0]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845) [spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [javax.servlet-api-3.1.0.jar:3.1.0]
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812) [jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]

Некоторая отладка QuerydslPredicateBuilder.reifyPath позволила мне понять, что userGroups - это ListPath, и есть попытка использовать отражение, чтобы найти на нем «имя» свойства. Но путь query-dsl, который мне действительно понадобится, user.userGroups.any().name

Попытка использовать любой другой синтаксис для URL-адреса, похоже, не распознается как допустимый PropertyPath в QuerydslPredicateBuilder.getPredicate.

Это ошибка?


person gazal    schedule 03.02.2016    source источник
comment
какие-нибудь обновления по этому поводу?   -  person chrismarx    schedule 05.08.2016
comment
нет, я надеялся, что кто-то из команды Spring-Data прояснит   -  person gazal    schedule 07.08.2016
comment
Думаю, нам, возможно, придется внести здесь свой вклад: github.com/spring-projects/spring-data -jpa   -  person gazal    schedule 07.08.2016
comment
Похоже, это ошибка - jira.spring.io/browse/DATAREST-694   -  person chrismarx    schedule 08.08.2016
comment
Я не думаю, что эта ошибка действительно отражает проблему, о которой я упоминал, но решение этой ошибки может помочь. Я проголосовал за это :)   -  person gazal    schedule 09.08.2016


Ответы (1)


В моем случае обновление до Spring-data Ingalls-SR7 устранило эту проблему.

person Pablo    schedule 27.09.2017