对于一般的 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
的代码)
谢谢你。
我认为这是关于命名以及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的连接出现