【问题标题】:java: Unable to implement Repository method: PersonRepository.save(Object entity). No possible implementations foundjava:无法实现存储库方法:PersonRepository.save(Object entity)。没有找到可能的实现
【发布时间】:2023-02-02 14:29:17
【问题描述】:

我正在制作一个小端点,但它对我不起作用。这非常简单,为此我使用 micronaut

我的 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.autentia</groupId>
    <artifactId>autentia</artifactId>
    <version>0.1</version>
    <packaging>${packaging}</packaging>

    <parent>
        <groupId>io.micronaut</groupId>
        <artifactId>micronaut-parent</artifactId>
        <version>3.3.4</version>
    </parent>

    <properties>
        <packaging>jar</packaging>
        <jdk.version>11</jdk.version>
        <release.version>11</release.version>
        <micronaut.version>3.3.4</micronaut.version>
        <exec.mainClass>com.autentia.Application</exec.mainClass>
        <micronaut.runtime>netty</micronaut.runtime>
    </properties>

    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo.maven.apache.org/maven2</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-inject</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-validation</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.test</groupId>
            <artifactId>micronaut-test-junit5</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-client</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-server-netty</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-jackson-databind</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-runtime</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.data</groupId>
            <artifactId>micronaut-data-hibernate-jpa</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>io.micronaut.build</groupId>
                <artifactId>micronaut-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <!-- Uncomment to enable incremental compilation -->
                    <!-- <useIncrementalCompilation>false</useIncrementalCompilation> -->

                    <annotationProcessorPaths combine.children="append">
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.22</version>
                        </path>
                        <path>
                            <groupId>io.micronaut</groupId>
                            <artifactId>micronaut-http-validation</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut.data</groupId>
                            <artifactId>micronaut-data-processor</artifactId>
                            <version>3.2.2</version>
                        </path>
                    </annotationProcessorPaths>
                    <compilerArgs>
                        <arg>-Amicronaut.processing.group=com.autentia</arg>
                        <arg>-Amicronaut.processing.module=autentia</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project> 

我的存储库:


import com.prueba.entity.Person;
import io.micronaut.data.annotation.Repository;
import io.micronaut.data.repository.CrudRepository;

@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {

}

我的实体:



import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter
@Setter
public class Person {

    @Id
    @GeneratedValue
    private Long Id;

    private String name;

    private String surname;

}

最后,报错

java: 无法实现存储库方法:PersonRepository.findById(Object id)。无法在不存在的属性上查询实体 [Person]:Id

我做错了什么?谢谢

【问题讨论】:

  • 也许 lombok 导致了问题.. 看起来他没有找到预期的 @Id
  • 您是否尝试过用大写字母 I 命名您的字段 id(全部小写)而不是 Id
  • 此外,+1 到“可能是龙目岛”的统计
  • 并且 +1 到“您是否尝试过命名您的字段 ID”和“可能是 lombok 导致了问题”。应该首先列出 Lombok 注释。
  • 我已经删除了 lombok 注释并使用了 getter 和 setter,现在我得到了一个新错误....这是:java:无法实现存储库方法:PersonRepository.delete(对象实体)。删除所有不支持没有 ID 的实体我找不到关于 micronaut 的信息,就像我用 spring boot 找到它一样

标签: micronaut micronaut-data


【解决方案1】:

理想情况下,您应该下载或创建 micronaut 项目并选择 Lombok 依赖项,这样您就不会遇到这个问题。

但是如果你想稍后在项目中添加 lombok,这里是指南。

你需要做的就是,以正确的顺序添加依赖项. 注释处理器的顺序似乎在这里起着重要的作用。 如下所述使用这些依赖项。

注意:此答案基于 gradle,但该概念也适用于 Maven

第1步:使用下面的 lombok 注释处理器作为依赖项中的第一件事:

annotationProcessor("org.projectlombok:lombok")

第2步:然后在注解处理器之后,使用 lombok 编译时依赖:

compileOnly("org.projectlombok:lombok")

第 3 步:然后你可以编写其余的依赖项:

implementation("io.micronaut.data:micronaut-data-hibernate-jpa")
runtimeOnly("ch.qos.logback:logback-classic")
...
...

构建.gradle(依赖部分)

dependencies {

    /* Step 1 */
    annotationProcessor("org.projectlombok:lombok")
    annotationProcessor("io.micronaut:micronaut-http-validation")
    annotationProcessor("io.micronaut.data:micronaut-data-processor")
    annotationProcessor("io.micronaut.openapi:micronaut-openapi")

    /* Step 2 */
    compileOnly("org.projectlombok:lombok")

    /* Step 3 */
    implementation("io.micronaut:micronaut-http-client")
    implementation("io.micronaut:micronaut-jackson-databind")
    implementation("io.micronaut.flyway:micronaut-flyway")
    implementation("io.micronaut.oraclecloud:micronaut-oraclecloud-atp")
    implementation("io.micronaut.oraclecloud:micronaut-oraclecloud-sdk")
    implementation("io.micronaut.sql:micronaut-jdbc-hikari")
    implementation("jakarta.annotation:jakarta.annotation-api")
    implementation("io.micronaut.data:micronaut-data-hibernate-jpa")
    implementation("org.apache.commons:commons-lang3:3.12.0")
    implementation("io.swagger.core.v3:swagger-annotations")
    runtimeOnly("ch.qos.logback:logback-classic")
}

【讨论】:

    【解决方案2】:

    本指南将帮助您创建您的第一个 Micronaut JDBC 应用程序。

    https://guides.micronaut.io/latest/micronaut-data-jdbc-repository-maven-java.html

    如果您想使用 Lombok,请在使用 Micronaut CLI 或 Micronaut Launch 时将其添加为一项功能。

    还有其他 guidesdocumentation 应该对您的旅程有所帮助。

    【讨论】:

      【解决方案3】:

      我前一段时间遇到了同样的问题,

      在我创建之后它对我来说很好用得到方法而不是使用@盖特龙目岛每次都为我工作。

      发生这种冲突是因为JPA使用@柱子@ID将实体中的字段映射到数据库中的列。当 Lombok 为这些字段生成 getter 时,它会干扰JPA映射并发生错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 2022-01-15
        • 2012-07-11
        相关资源
        最近更新 更多