如何在Kotlin中使用QueryDSL并生成文件

时间:2018-02-01 07:40:58

标签: spring plugins kotlin querydsl

我使用下面的maven pom.xml文件,无法生成querydsl文件。

我找到了一个问题:Kotlin-Kapt Annotation Processor not working with maven

我想从kotlin实体类生成jpa querydsl文件。

有一个很好的在线示例,说明如何使用gradle https://github.com/JetBrains/kotlin-examples/blob/master/gradle/kotlin-querydsl/build.gradle生成dsl文件。

但是我试图在maven中实现这个并且没有运气。我现在的pom在下面。有谁知道问题可能是什么?提前谢谢。

使用querydsl3,我使用4

<div><input type="text" class="txtbox" id=@Guid.NewGuid().ToString() /></div>


$(document).ready(function () {

        var full_url = document.URL;
        var url_array = full_url.split('/') // Split the string into an array with / as separator
        var last_segment = url_array[url_array.length - 1];  // Get the last part of the array (-1)
        $.ajax({
            cache: false,
            type: "POST",
            url: '@Url.Action("PageLoad", "Instructor")',
            data: { id: last_segment },
            success: function (data) {
                $.each(data, function(key, val) {
                    $.each(val, function(key,val)
                    {
                         $.each(val, function (key, val) {
                             $("#tbl tr.item").each(function () {
                                 //$(this).find("input.txtbox").attr("disabled", "disabled");
                                 $(this).find("input.txtbox").value = val.Result; //Here i'm trying to set value 
                                alert(val.Result);
                                return false;
                            });

                        });
                    });
                });
            }
        });

    });

感谢

3 个答案:

答案 0 :(得分:3)

我今天遇到了这个。有一些问题在起作用:

  1. “kapt”插件挂钩“编译”阶段,因此你在那里的任何编译器插件(no-arg / JPA / Spring)都会覆盖它。你可以在<jpa>块中注释掉<compilerPlugins>行,它应该吐出你的Q类,但是你会丢失你的实体类'no-arg constructors。
  2. 即使你在Kotlin版本1.2.20之前就可以正常工作,但是当遇到已经存在的生成输出文件时,由于kapt bugging而导致后续编译无法运行。这已在1.2.20中修复。
  3. 可以将<compilerPlugins>块从顶部<plugin> - 级别向下移动到“编译”执行,但这有效地导致插件被忽略。我的项目将编译,但由于Spring配置类被视为final而我的实体类缺少no-arg默认构造函数,因此在运行时失败。
  4. 我找到的解决方案是将kotlin-maven-plugin的<compile>执行从compile阶段移至process-sources阶段,例如:

    <build>       
    <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
    
    
        <plugins>
            <plugin>
                <artifactId>kotlin-maven-plugin</artifactId>
                <groupId>org.jetbrains.kotlin</groupId>
                <version>${kotlin.version}</version>
                <configuration>
                    <jvmTarget>1.8</jvmTarget>
                    <compilerPlugins>
                        <plugin>spring</plugin>
                        <plugin>jpa</plugin>
                    </compilerPlugins>
                </configuration>
    
                <executions>
    
                    <execution>
                        <id>compile</id>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
    
                    <execution>
                        <id>kapt</id>
                        <goals>
                            <goal>kapt</goal>
                        </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>src/main/kotlin</sourceDir>
                            </sourceDirs>
                            <annotationProcessorPaths>
                                <annotationProcessorPath>
                                    <groupId>com.querydsl</groupId>
                                    <artifactId>querydsl-apt</artifactId>
                                    <version>${querydsl.version}</version>
                                    <classifier>jpa</classifier>
                                </annotationProcessorPath>
                            </annotationProcessorPaths>
                        </configuration>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>src/test/kotlin</sourceDir>
                                <sourceDir>target/generated-sources/kapt/test</sourceDir>
                            </sourceDirs>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-allopen</artifactId>
                        <version>${kotlin.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-noarg</artifactId>
                        <version>${kotlin.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    

    这适用于使用Spring-Data-JPA和Spring-Data-REST的Spring Boot项目。

答案 1 :(得分:0)

AFAIK是不可能的,因为QueryDSL插件分析源,而不是字节码。当然,它无法理解kotlin类的来源。

所以我看到的唯一方法是将实体类移动到单独的模块并在java中重写它们。

答案 2 :(得分:0)

N. DaSilva的示例对我不起作用,因为在kapt执行中缺少“生成源”阶段。以下配置解决了该问题。 (很抱歉,声誉不足,仅可在评论中举报)。

             <executions>
                <execution>
                    <id>compile</id>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <execution>
                    <id>kapt</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>kapt</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>src/main/kotlin</sourceDir>
                        </sourceDirs>
                        <annotationProcessorPaths>
                            <annotationProcessorPath>
                                <groupId>com.querydsl</groupId>
                                <artifactId>querydsl-apt</artifactId>
                                <version>${querydsl.version}</version>
                                <classifier>jpa</classifier>
                            </annotationProcessorPath>
                        </annotationProcessorPaths>
                    </configuration>
                </execution>
            </executions>