当前位置: 首页 > 知识库问答 >
问题:

Jpa存储库将自定义接口误认为属性

陈坚
2023-03-14

对于一般的 spring JpaRepository DAO(无 spring-boot),如果接口扩展了一个自定义接口,spring 会把接口方法误认为是对象的属性。

例如

interface ILocalDateTime {
  fun getLocalDateTime() : LocalDateTime
}

interface UserDaoCustom : ILocalDateTime {
    // query functions skipped
}

interface UserDao : JpaRepository<User, Long>, UserDaoCustom

class UserImpl : UserDaoCustom {

  @PersistenceContext
  private lateinit var em: EntityManager

  override fun getLocalDateTime(): LocalDateTime {
    return LocalDateTime.now()
  }

  // query functions skipped
}

这是一个简化的用户道UserDaoCustom扩展了ILocalDateTime,其中包含一个方法getLocalDateTime

注意:< code>localDateTime不是< code>User的字段。

在运行时,JpaRepository 会将 getLocalDateTime(或 localDateTime?)误认为是用户的字段,并抛出这样的异常:

Caused by: org.springframework.data.repository.query.QueryCreationException: 
Could not create query for public abstract java.time.LocalDateTime foo.ILocalDateTime.getLocalDateTime()! 
Reason: Failed to create query for method public abstract java.time.LocalDateTime foo.ILocalDateTime.getLocalDateTime()! 
No property getLocalDateTime found for type User!; 
nested exception is java.lang.IllegalArgumentException: 
Failed to create query for method public abstract java.time.LocalDateTime foo.ILocalDateTime.getLocalDateTime()! 
No property getLocalDateTime found for type User!

环境:

Kotlin 1.6.20
Spring 5.3.19
spring-data-jpa 2.5.11

如何解决这个问题?(能够或无法修改ILocalDateTime的代码)

谢谢你。

共有1个答案

空谦
2023-03-14

我认为这是关于命名以及Spring如何选择存储库扩展的实现。

TLDR;将实现的名称从< code>UserImpl更改为< code>UserDaoCustomImpl。

我检查过一个类似的设置,使用您的命名失败,出现完全相同的错误,但命名为“正确”会使其正常工作

public interface ILocalDateTime {
    LocalDateTime getLocalDateTime();
}

@Repository
public interface UserDao extends UserDaoCustom, JpaRepository<User, Long> {
}

public interface UserDaoCustom extends ILocalDateTime{
}

@Repository
public class UserDaoCustomImpl implements UserDaoCustom {
    @Override
    public LocalDateTime getLocalDateTime() {
        return LocalDateTime.now();
    }
}

和测试

@ExtendWith(SpringExtension.class)
@DataJpaTest
class UserRepositoryTest {
    @Autowired
    private UserDao userDao;

    @Test
    public void savesUser() {
        userDao.save(new User());
    }

    @Test
    public void bazzinga() {
        assert userDao.getLocalDateTime() != null;
        System.out.println("Bazzinga!"+userDao.getLocalDateTime());
    }


}
 类似资料:
  • 我使用jpa存储库进行自定义查询。但我发现了错误 错误日志: 通过字段“login service”表示的不满足的依赖关系;嵌套异常为org.springframework.beans.factory.unsatisfieddependencyexception:创建名为“login service”的bean时出错:通过字段“login serviceimpl”表示的不满足依赖项;嵌套异常为or

  • 在我的项目中有几个实体具有相同的属性(对于示例'name'),所以,有可能创建一个存储库,其中使用自定义的select(实体)?因此,我从JpaRepository扩展了我的存储库,我扩展了MyCustomJpaRepository,MyCustomJpaRepository也扩展了JpaRepository,使其能够从JpaRepository授予基本功能? TKS

  • 我目前正在spring boot中编写一个应用程序,并正在构建自己的自定义存储库。 首先,这里是有问题的代码: 启动应用程序后,它会失败,并出现以下堆栈跟踪: 非常感谢您的帮助:) 注意:此设置以前与JPA存储库一起使用,因此这不是服务调用它的问题,而是新服务存储库的故障。

  • 我使用的是Spring数据JPA1.10.11。释放 我有一个基础存储库,所有其他存储库都会扩展它。这部分有效。 我还想为一些要扩展的存储库声明一个自定义接口。所以我声明了一个接口和一个“Impl”类: 然后,我创建一个现有的工作存储库来扩展这个新接口: 注意:此存储库在扩展TestRepository之前工作,但是在如上扩展之后,应用程序上下文将无法以错误开始: 配置如下所示: 我觉得我一直在遵

  • 本机查询为: 现在我有了表Hibernate实体,所以我在ApplicationRepository中尝试了 日志上说

  • 我有Mysql 8.0.19作为docker实例。在我们之前的应用程序中,我们使用JDK的默认密钥库进行SSL。使用JDK的密钥库连接到Mysql服务器,无论使用SSL还是不使用SSL都可以。这里我们没有手动配置Mysql的SSL。我们使用Mysql的默认SSL机制。 现在出于某种原因,我们决定使用我们自己的密钥库,并使用以下变量覆盖JVM的密钥库 在此之后,与mysql for SSL的连接出现