spring-projects / spring-projects/spring-data-commons

QuerydslPredicateBuilder looks at Type properties instead of QType [DATACMNS-1760]

Open
#2,176 5 comments 0 reactions 1 assignee View on GitHub

@odrotbohm is already working on this.

Since Dec 30, 2020.

in: repository type: bug
Dominant language
Java
Stars
838
Forks
730
PR merge metrics
No merged PRs in 30d

Description

James Howe opened DATACMNS-1760 and commented

When constructing a Querydsl predicate from request parameters, the source type is inspected to determine which parameter names to use, instead of the query type.

This results in exceptions for properties that exist but are not queryable. Instead they should behave the same as properties that don't exist, and be ignored.

 

@Data
@Entity
public class Example {
    private String one;

    @QueryType(PropertyType.NONE)
    private String two;

    private transient String three;
}
@Controller
public class ExampleController {
    @RequestMapping("/")
    public void test(@QuerydslPredicate(root = Example.class) Predicate predicate) {
    }
}

GET /?one=foo -> success
GET /?two=foo -> error
GET /?three=foo -> error
GET /?four=foo -> success

 

java.lang.IllegalArgumentException: Unable to find field two on class com.example.QExample!
	at org.springframework.data.util.ReflectionUtils.findRequiredField(ReflectionUtils.java:211)
	at org.springframework.data.querydsl.binding.PropertyPathInformation.lambda$reifyPath$3(PropertyPathInformation.java:139)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at org.springframework.data.querydsl.binding.PropertyPathInformation.reifyPath(PropertyPathInformation.java:135)
	at org.springframework.data.querydsl.binding.PropertyPathInformation.reifyPath(PropertyPathInformation.java:125)
	at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.lambda$null$0(QuerydslPredicateBuilder.java:153)
	at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
	at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.lambda$getPath$1(QuerydslPredicateBuilder.java:153)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.getPath(QuerydslPredicateBuilder.java:153)
	at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.invokeBinding(QuerydslPredicateBuilder.java:135)
	at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.getPredicate(QuerydslPredicateBuilder.java:116)
	at org.springframework.data.web.querydsl.QuerydslPredicateArgumentResolver.resolveArgument(QuerydslPredicateArgumentResolver.java:125)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	... 107 more

Affects: 2.3.1 (Neumann SR1)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.