gpt4 book ai didi

java - @Primary JpaRepository 不用于@Autowired

转载 作者:行者123 更新时间:2023-11-29 04:20:03 25 4
gpt4 key购买 nike

我有最简单的 Spring 配置案例,所以我不知道为什么我找不到这是如何完成的。

我有一个界面

public interface UserService {
List<User> findAll();
}

有两个实现

@Component
public class SimpleUserService implements UserService {
private List<User> users = Arrays.asList(new User());

@Override
public List<User> findAll() {
return Collections.unmodifiableList(users);
}
}

@Repository
@Primary
public interface UserRepository extends JpaRepository<User, Integer>, UserService {
}

注意 @Repository 被标记为 @Primary,所以当我这样做时:

@RestController
public class SimpleUserController implements UserController {
@Autowired
private UserService userService;

@Override
@GetMapping("/users")
public List<User> getAllUsers() {
return userService.userResources;
}
}

它应该使用 UserRepository,不是吗?相反,我得到

Field userService in com.studying.user.SimpleUserController required a single bean, but 2 were found:

  • UserDaoService: defined in file [...\SimpleUserService.class]

  • userRepository: defined in null

我知道 Spring 创建了一个实际的类来实现存储库,所以我想这可能是问题所在,但还有办法做到这一点吗?

作为一个附加问题,我将如何创建两个配置,一个使用简单服务,另一个使用存储库?这不像我可以在配置中的 @Bean 注释方法中实例化存储库。我会向配置的私有(private)成员添加一个 @Autowired 并将其返回,但由于与上述相同的原因,这将不起作用。

最佳答案

对于 Spring Data 接口(interface),您既不需要 @Component 也不需要 @Repository。存储库由不同的 Spring Data 机制检测,而不是 Spring 本身的常规组件扫描。这也是为什么您的 @Primary 注释没有任何效果的原因。

解决方案可能如下所示:

public interface UserService {}

@Component
public class SimpleUserService implements UserService {}

@Component
public class JpaUserService implements UserService {

@Autowired
UserRepository userRepository
}

public interface UserRepository extends JpaRepository<User, Integer> {}

然后,您可以清楚地分离带有 Spring Data 存储库的存储层和使用存储层的服务层。您也不要混合使用常规的 Spring bean 注释和 Spring Data 存储库接口(interface),这也会简化您的工作。

然后您可以例如将 SimpleUserService 移动到测试源文件夹中,如果它应该仅可用于单元测试,并将其标记为 @Primary。或者您可以使用 @Conditional 注释 ( https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Conditional.html ) 提供一种更复杂的方式来决定您要使用哪个实现。

关于java - @Primary JpaRepository 不用于@Autowired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49953593/

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