gpt4 book ai didi

java - 在 Spring 中获取自定义存储库的域类型

转载 作者:太空宇宙 更新时间:2023-11-04 09:56:35 25 4
gpt4 key购买 nike

下午好,这是我在 StackOverflow 上的第一个问题。

我不是Spring框架的专家,有时我会因为一些相对容易解决的问题而迷失很多时间,但这一次我真的无法摆脱它。

我正在尝试在自定义 Spring 数据存储库中实现一种方法,该方法应该与多个实体一起使用,并根据实体字段上特定注释的存在对数据库执行一些操作。

我尝试了很多在互联网上找到的解决方法,但实际上无法达到我需要的结果。我会尝试更具体:

这是带有注释的示例实体:

@Data
@Entity
@MyAnnotation
public class User{

@Id
@MyDataAnnotation
private Long id;

@MyDataAnnotation
private String firstName;

@MyDataAnnotation
private String lastName;

private String userName;
private int followers;
private int following;
}

然后我在 UserService 类中有这样的内容:

@Service
public class UserService {

private final UserRepository repository;

public void doSomethingOnUser(Long id){
repository.myCustomMethod(id);
}
}

对于 UserRepository 我做了类似的事情,只是非常基本的东西:

@Repository
public interface UserRepository extends CrudRepository<User,Long>,MyCustomRepository<User,Long> {}

我有自定义存储库界面:

public interface MyCustomRepository<T,ID>{

public void myCustomMethod(ID id);
}

最后是 myCustomMethod 的实现:

public class MyCustomRepositoryImpl <T,ID> implements MyCustomRepository{

@PersistenceContext
EntityManager entityManager;


@Override
public void myCustomMethod(Object id){

User user = entityManager.find(User.class,id);

List<Field> markedFields = MyAnnotationProcessor.getAnnotated(user.getClass());

//Here I'll manipulate the fields that i've obtained
...

entityManager.persist(u);

//And then i'm persisting the modified entity
}
}

这实际上是与用户实体一起工作的,但我需要找到一种方法让它适用于由扩展 MyCustomRepository 的存储库管理的每个域类型。

例如,如果我有:

public interface WhateverRepository extends CrudRepository<WhateverClass,Long>,MyCustomRepository<WhatheverClass,Long>

无论如何,myCustomMethod 应该做他的事情。

我尝试的一件事是检索 Class<T>这段代码的实例:

 private final Class<T> type;

public MyCustomRepositoryImpl(Class<T> type) {
this.type = type;
}

并使用 type 而不是 User.class 但无法加载 ApplicationContext:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.Class<?>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}`

感谢您阅读到这里,希望您能给我一些提示,如果我不够清楚,请随时向我询问更多信息。

更新:

在 @amineT 回答之后,我尝试使用 Spring 提供的 GenericTypeResolver,但实际上我得到的是 null,而不是类型。documentation声明如果返回 null,则意味着它无法解析该类型。

这是我使用的代码:

private final Class<?>[] genericType;

public MyCustomRepositoryImpl(){
this.genericType = GenericTypeResolver.resolveTypeArguments(getClass(), MyCustomRepositoryImpl.class);
}

我认为这个“问题”在某种程度上与Spring在幕后所做的所有代理有关,但我目前没有任何确切的想法。

如果有人有任何线索,请写在这里,我们将不胜感激。

最佳答案

我遇到了类似的问题,这个 answer帮助我。您收到 NoSuchBeanDefinitionException 是因为您尝试注入(inject)类类型字段,但没有在 Spring 上下文中创建该字段。您需要做的是使用 Spring 的 GenericTypeResolver 来查找泛型类型并相应地处理您的数据。希望这有帮助

关于java - 在 Spring 中获取自定义存储库的域类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54076559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com