无法在控制器中自动装配多个服务

Posted

技术标签:

【中文标题】无法在控制器中自动装配多个服务【英文标题】:Couldn't Autowired multiple Services in a Controller 【发布时间】:2019-07-15 14:39:49 【问题描述】:

我有两个服务,我想在一个控制器中使用它们。我使用了@Autowired注解和@Qualifier-s,但是有些东西不起作用,可能是因为没有Contructor。

控制器:

@Controller
public class Main

@Autowired
@Qualifier("postServiceImpl")
private PostService postService;

@Autowired
@Qualifier("userServiceImpl")
private UserService userService;


@ModelAttribute("post")
public PostDTO userRegistrationDto() 
    return new PostDTO();


@GetMapping("/")
public String root(Model model) 
    model.addAttribute("list", postService.listAllPosts());
    return "index";

@GetMapping("/adminPage")
public  String admin(Model model)

???
    model.addAttribute("posts", postService.listAllPosts());
    model.addAttribute("users", userService.listAllUsers());
    return "admin";


服务 1:

@Service
public class PostServiceImpl implements PostService 

@Autowired
private PostRepository postRepository;

public PostServiceImpl(PostRepository postRepository)
    this.postRepository = postRepository;


public PostServiceImpl()


服务 2:

@Service
public class UserServiceImpl implements UserService 

@Autowired
private UserRepository userRepository;

@Autowired
private BCryptPasswordEncoder passwordEncoder;

这是在一个模型中添加两​​个服务属性的正确方法吗?

model.addAttribute("posts", postService.listAllPosts());
model.addAttribute("users", userService.listAllUsers());

【问题讨论】:

实际的错误信息是什么? 【参考方案1】:

您需要在服务类上方的@Service 注释中添加限定符名称,如下所示:

@Service("userServImpl")
public class UserServiceImpl implements UserService 

@Service("postServImpl")
public class PostServiceImpl implements PostService 

如果接口只有一种实现,您可以像这样自动装配:

@Autowired
private UserService userServiceImpl;

@Autowired
private PostService postServiceImpl;

请注意,对象名称是特定实现的驼峰式名称。在这种情况下,您无需在@Service 注解中指定限定符名称。

【讨论】:

以上是关于无法在控制器中自动装配多个服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring框架的新手收到此错误:无法自动装配字段:

创建 bean 时出错。注入自动装配的依赖项失败。无法自动装配字段

在 Spring Boot 中的控制器中自动装配通用(T)服务

Spring--自动装配

自动装配的 bean 在 MVC 控制器中为空

Spring cloud sleuth 注解:自动装配不起作用