任何人都可以帮我调试这个错误吗
Parameter 0 of constructor in com.example.demo.service.UserServiceImpl required a
bean of type 'com.example.demo.dao.UserDao' that could not be found.
Action:
Consider defining a bean of type 'com.example.demo.dao.UserDao' in your configuration.
以下是我的文件:
UserController.java
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{userId}")
public User getUserById(@PathVariable Long userId) {
return userService.getUserById(userId);
}
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@PostMapping
public Long addUser(@RequestBody User user) {
return userService.addUser(user);
}
@PutMapping("/{userId}")
public void updateUser(@PathVariable Long userId, @RequestBody User user) {
user.setUserId(userId);
userService.updateUser(user);
}
@DeleteMapping("/{userId}")
public void deleteUser(@PathVariable Long userId) {
userService.deleteUser(userId);
}
}
UserService.java
package com.example.demo.service;
import com.example.demo.model.User;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.List;
public interface UserService {
User getUserById(Long userId);
List<User> getAllUsers();
Long addUser(User user);
void updateUser(User user);
void deleteUser(Long userId);
}
UserServiceImpl.java
package com.example.demo.service;
import com.example.demo.dao.UserDao;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
private final UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public User getUserById(Long userId) {
return userDao.getUserById(userId);
}
@Override
public List<User> getAllUsers() {
return userDao.getAllUsers();
}
@Override
public Long addUser(User user) {
return userDao.addUser(user);
}
@Override
public void updateUser(User user) {
userDao.updateUser(user);
}
@Override
public void deleteUser(Long userId) {
userDao.deleteUser(userId);
}
}
UserDaoImpl.java
package com.example.demo.dao;
import com.example.demo.model.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserDaoImpl implements UserDao {
private final JdbcTemplate jdbcTemplate;
public UserDaoImpl(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public User getUserById(Long userId) {
String sql = "SELECT * FROM user WHERE user_id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{userId}, new BeanPropertyRowMapper<>(User.class));
}
@Override
public List<User> getAllUsers() {
String sql = "SELECT * FROM user";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
}
@Override
public Long addUser(User user) {
String sql = "INSERT INTO user (first_name, last_name, email, user_avatar_url, podcast_id) " +
"VALUES (?, ?, ?, ?, ?)";
jdbcTemplate.update(sql, user.getFirstName(), user.getLastName(), user.getEmail(),
user.getUserAvatarUrl(), user.getPodcastId());
// Retrieve the auto-generated user_id
return jdbcTemplate.queryForObject("SELECT LAST_INSERT_ID()", Long.class);
}
@Override
public void updateUser(User user) {
String sql = "UPDATE user SET first_name = ?, last_name = ?, email = ?, " +
"user_avatar_url = ?, podcast_id = ? WHERE user_id = ?";
jdbcTemplate.update(sql, user.getFirstName(), user.getLastName(), user.getEmail(),
user.getUserAvatarUrl(), user.getPodcastId(), user.getUserId());
}
@Override
public void deleteUser(Long userId) {
String sql = "DELETE FROM user WHERE user_id = ?";
jdbcTemplate.update(sql, userId);
}
}
UserDao.java
package com.example.demo.dao;
import com.example.demo.model.User;
import java.util.List;
public interface UserDao {
User getUserById(Long userId);
List<User> getAllUsers();
Long addUser(User user);
void updateUser(User user);
void deleteUser(Long userId);
}
DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
//@ComponentScan("com.example.demo.service")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
我已经在 DemoApplication.java 中尝试了
@ComponentScan("com.example.demo.service")
,但它不起作用。
我还尝试放置@Autowire并用@Service标记服务。我还检查了所有其他注释,没有发现任何其他遗漏的内容
我希望有一个干净的构建和对 api 的访问
您还没有提供 UserService 实现,Spring 无法将其作为 bean 找到。您有几个选择:
提供 UserService 接口的实现,将
@Service("UserService")
注解放在实现类上,并从接口中删除该注解。
将接口更改为具体类并实现方法。
还有其他方法,例如抽象类,但它们往往不常见。
您缺少
UserService
的实现。如果您想保留当前的 @Repository
(UserDao
) 实现,那么您可以按如下方式重写您的服务:
@Service
public class UserService {
private final UserDao userDao;
@Autowired
public UserService(UserDao userDao) {
this.userDao = userDao;
}
// implement using your DAO
User getUserById(Long userId);
List<User> getAllUsers();
Long addUser(User user);
void updateUser(User user);
void deleteUser(Long userId);
}
这应该可以让
UserController
使用。
编辑:
更新后,您的
UserDaoImpl
现在似乎无法自动注入,因为它丢失了@Autowired
:
@Repository
public class UserDaoImpl implements UserDao {
private final JdbcTemplate jdbcTemplate;
@Autowired
public UserDaoImpl(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}