代码之家  ›  专栏  ›  技术社区  ›  D-Dᴙum

@QuerydslPredicate引发异常

  •  2
  • D-Dᴙum  · 技术社区  · 7 年前

    @QuerydslPredicate 但我的测试API在调用时失败:

    Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for interface com.querydsl.core.types.Predicate] with root cause
    
    java.lang.NoSuchMethodException: com.querydsl.core.types.Predicate.< init >()
    

    这是我的控制器类中的方法:

    @ResponseBody
    @RequestMapping(value = "/user/query", method = RequestMethod.GET)
    public Iterable<User> getByCriteria(@QuerydslPredicate(root = User.class) Predicate predicate)
    {
        return this.userDao.getByCriteria(predicate);
    }
    

    this 春季博客文章和 this example 尝试实现我的API,但我不明白我做错了什么。

    pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.example</groupId>
        <artifactId>email-encrypt</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.2.RELEASE</version>
        </parent>
        <name>email-encrypt</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <querydsl.version>4.1.4</querydsl.version>
            <springfox.version>2.6.1</springfox.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk15on</artifactId>
                <version>1.59</version>
            </dependency>
    
            <dependency>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcpkix-jdk15on</artifactId>
                <version>1.59</version>
            </dependency>
    
            <dependency>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcmail-jdk15on</artifactId>
                <version>1.59</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.querydsl</groupId>
                <artifactId>querydsl-apt</artifactId>
                <version>${querydsl.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.querydsl</groupId>
                <artifactId>querydsl-jpa</artifactId>
                <version>${querydsl.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.derby</groupId>
                <artifactId>derby</artifactId>
                <version>10.14.1.0</version>
                <scope>runtime</scope>
            </dependency>
    
    
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${springfox.version}</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${springfox.version}</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.20</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.20</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>com.mysema.maven</groupId>
                    <artifactId>apt-maven-plugin</artifactId>
                    <version>1.1.3</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>process</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${build.directory}/generated-sources/java</outputDirectory>
                                <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    编辑#2

    here

    2 回复  |  直到 7 年前
        1
  •  2
  •   cristobalrosa    7 年前

    如果您注释掉swagger配置类上的@Configuration,那么它就可以工作了。我仍然在试图理解为什么,我猜在这个注释中,spring加载配置的方式是不同的,这是导致问题的原因。

    //@Configuration
    @EnableSwagger2
    public class SwaggerConfiguration extends WebMvcConfigurationSupport
    
        2
  •  0
  •   Stefan Repcek    7 年前

    我认为你的问题在于pom.xml文件. 请确保您使用的是兼容版本的查询dsl。例如,如果您使用 spring-data-jpa 2.0.8,您应该使用 querydsl-*

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>2.0.8.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-*</artifactId>
        <version>4.1.4</version>
    </dependency>
    

    你可以登记入住 maven repository

    编辑1 尝试将querydsl核心添加到maven中:

     <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-core</artifactId>
            <version>4.1.4</version>
     </dependency>
    
        3
  •  0
  •   aksh1618    5 年前

    延伸 @cristobalrosa's answer ,这可能是由于springboot没有配置web应用程序。例如,我的项目也有 SwaggerConfig 延伸 WebMvcConfigurationSupport

    @Configuration
    @EnableSwagger2
    public class SwaggerConfig extends WebMvcConfigurationSupport {
        // Docket bean
        
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        }
    }
    

    注:除此之外 WebMVCConfiguration支持 ,比如 @EnableWebMvc &安培; WebMvcConfigurer 也可能导致没有使用springboot的web自动配置。

    Swagger Issue comment

        4
  •  0
  •   hynuah_iia    4 年前

    我只想和大家分享一下情况,可以给大家一些提示。所以看看我的配置和依赖关系,阅读我链接的文章。尝试 @EnableWebMvc 而不是“WebMvcConfigurationSupport”

    java.lang.IllegalStateException: No primary or default constructor found for interface com.querydsl.core.types.Predicate
    Caused by: java.lang.NoSuchMethodException: com.querydsl.core.types.Predicate.<init>()
        at java.base/java.lang.Class.getConstructor0(Class.java:3427)
        at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2631)
        at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:216)
    

    依赖关系

        dependencies {
            implementation 'org.springframework.boot:spring-boot-starter-web'
            implementation "org.springframework.data:spring-data-commons"
            implementation "com.querydsl:querydsl-apt:4.3.1"
            implementation "com.querydsl:querydsl-jpa:4.3.1"
        }
    

    QueryDSLWeb支持从1.11开始就在SpringDataCommons中提供 从 https://www.baeldung.com/rest-api-search-querydsl-web-in-spring-data-jpa

    在我的情况下,我必须实施 WebMvcConfigurer 再加上 WebMvcConfigurationSupport @启用WebMVC WebMvcConfigurationSupport with @Configuration . 我只是猜测WebMvcConfigurationSupport没有实现 init() of Predicate

    @Configuration
    //@EnableSpringDataWebSupport // <-- doesn't necessary for me
    @EnableSwagger2
    @EnableWebMvc // <-- add
    public class SwaggerConfig implements WebMvcConfigurer { //<-- instead of 'WebMvcConfigurationSupport'
       ...
    }
    

    来自Spring文档的QueryDSL web支持

    当在类路径上找到Querydsl时,该特性将随@EnableSpringDataWebSupport自动启用。 https://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#core.web.type-safe

    控制器

        @GetMapping
        public List<InputMethodDto.Response> getInputMethodTypeList(
                @QuerydslPredicate(root = InputMethod.class) Predicate predicate) {
            return service.getInputMethodList(predicate);
        }
    

    存储库

    public interface InputMethodRepository extends JpaRepository<yourEntity, Long>, QuerydslPredicateExecutor<yourEntity>, QuerydslBinderCustomizer<QyourEntity> {
        @Override
        default void customize(final QuerydslBindings bindings, final QyourEntity root) {
            bindings.bind(String.class).first((StringPath path, String value)-> path.eq(value));
        }
    }