Spring 无法创建 UserService bean
Spring cannot create UserService bean
道层。我有抽象jpa dao接口,扩展接口,我添加了抽象实现,从中我扩展了其他实际使用的实现。这些类如下:
public interface AbstractDao<E> {
E findById(Long id);
List<E> findAll();
void save(E entity);
void update(E entity);
void delete(E entity);
void deleteById(Long entityId);
}
public interface UserDao extends AbstractDao<User> {
}
public abstract class AbstractDaoImpl<E> implements AbstractDao<E> {
private final Class<E> clazz;
@PersistenceContext
protected EntityManager entityManager;
public AbstractDaoImpl(Class<E> clazz) {
this.clazz = clazz;
}
@Override
public E findById(Long id) {
return entityManager.find(clazz, id);
}
@SuppressWarnings("unchecked")
@Override
public List<E> findAll() {
return entityManager
.createQuery("from " + clazz.getName())
.getResultList();
}
@Override
public void save(E entity){
entityManager.persist(entity);
}
@Override
public void update(E entity){
entityManager.merge(entity);
}
@Override
public void delete(E entity) {
entityManager.remove(entity);
}
@Override
public void deleteById(Long entityId){
E entity = findById(entityId);
delete(entity);
}
}
@Repository
public class UserDaoImpl extends AbstractDaoImpl<User> implements UserDao {
public UserDaoImpl() {
super(User.class);
}
}
服务层级。这里我还有抽象服务接口,一个扩展接口(UserService)及其抽象和真实实现:
public interface AbstractService<E, DTO> {
E findById(Long id);
List<E> findAll();
void save(E entity);
void update(E entity);
void delete(E entity);
void deleteById(Long entityId);
DTO convertToDTO(E entity);
}
public interface UserService extends AbstractService<User, UserDTO> {
}
@Getter @Setter @AllArgsConstructor
public abstract class AbstractServiceImpl<E, D extends AbstractDao<E>, DTO> implements AbstractService<E, DTO> {
private D dao;
private ModelMapper mapper;
@Override
public E findById(Long id) {
return dao.findById(id);
}
@Override
public List<E> findAll() {
return dao.findAll();
}
@Override
public void save(E entity) {
dao.save(entity);
}
@Override
public void update(E entity) {
dao.update(entity);
}
@Override
public void delete(E entity) {
dao.delete(entity);
}
@Override
public void deleteById(Long entityId) {
dao.deleteById(entityId);
}
}
@Service
public class UserServiceImpl extends AbstractServiceImpl<User, UserDao, UserDTO> implements UserService {
@Autowired
public UserServiceImpl(UserDao dao, ModelMapper mapper) {
super(dao, mapper);
}
@Override
public UserDTO convertToDTO(User entity) {
return getMapper().map(entity, UserDTO.class);
}
}
在我的实际项目中,我从 AbstractDao 和 AbstractServie 得到了很多扩展接口。您可以看到实际的层次结构:
我不明白为什么 spring 不能在我的控制器中创建带@Service 注释的 bean 和自动装配它们。任何帮助将不胜感激。
我冒昧地查看了您在 github 中的项目
https://github.com/tuanalexeu/JavaSchoolFinalTask
问题是您如何初始化 spring 上下文,根本没有读取 AppConfig 上下文。此上下文包含您的所有配置。
通过修改您的初始化程序以将您的 AppConfig 包含为根,所有 bean 都应该存在于相同的上下文中。 (您也可以选择拥有父 -> 子上下文,但这也应该在初始化程序中完成)。希望能帮助到你。祝你好运。
public class MainWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(final ServletContext sc) throws ServletException {
AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
root.register(AppConfig.class);
Dynamic servlet = sc.addServlet("dispatcher", new DispatcherServlet(root));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
sc.addListener(new ContextLoaderListener(root));
sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain"))
.addMappingForUrlPatterns(null, false, "/*");
}
}
道层。我有抽象jpa dao接口,扩展接口,我添加了抽象实现,从中我扩展了其他实际使用的实现。这些类如下:
public interface AbstractDao<E> {
E findById(Long id);
List<E> findAll();
void save(E entity);
void update(E entity);
void delete(E entity);
void deleteById(Long entityId);
}
public interface UserDao extends AbstractDao<User> {
}
public abstract class AbstractDaoImpl<E> implements AbstractDao<E> {
private final Class<E> clazz;
@PersistenceContext
protected EntityManager entityManager;
public AbstractDaoImpl(Class<E> clazz) {
this.clazz = clazz;
}
@Override
public E findById(Long id) {
return entityManager.find(clazz, id);
}
@SuppressWarnings("unchecked")
@Override
public List<E> findAll() {
return entityManager
.createQuery("from " + clazz.getName())
.getResultList();
}
@Override
public void save(E entity){
entityManager.persist(entity);
}
@Override
public void update(E entity){
entityManager.merge(entity);
}
@Override
public void delete(E entity) {
entityManager.remove(entity);
}
@Override
public void deleteById(Long entityId){
E entity = findById(entityId);
delete(entity);
}
}
@Repository
public class UserDaoImpl extends AbstractDaoImpl<User> implements UserDao {
public UserDaoImpl() {
super(User.class);
}
}
服务层级。这里我还有抽象服务接口,一个扩展接口(UserService)及其抽象和真实实现:
public interface AbstractService<E, DTO> {
E findById(Long id);
List<E> findAll();
void save(E entity);
void update(E entity);
void delete(E entity);
void deleteById(Long entityId);
DTO convertToDTO(E entity);
}
public interface UserService extends AbstractService<User, UserDTO> {
}
@Getter @Setter @AllArgsConstructor
public abstract class AbstractServiceImpl<E, D extends AbstractDao<E>, DTO> implements AbstractService<E, DTO> {
private D dao;
private ModelMapper mapper;
@Override
public E findById(Long id) {
return dao.findById(id);
}
@Override
public List<E> findAll() {
return dao.findAll();
}
@Override
public void save(E entity) {
dao.save(entity);
}
@Override
public void update(E entity) {
dao.update(entity);
}
@Override
public void delete(E entity) {
dao.delete(entity);
}
@Override
public void deleteById(Long entityId) {
dao.deleteById(entityId);
}
}
@Service
public class UserServiceImpl extends AbstractServiceImpl<User, UserDao, UserDTO> implements UserService {
@Autowired
public UserServiceImpl(UserDao dao, ModelMapper mapper) {
super(dao, mapper);
}
@Override
public UserDTO convertToDTO(User entity) {
return getMapper().map(entity, UserDTO.class);
}
}
在我的实际项目中,我从 AbstractDao 和 AbstractServie 得到了很多扩展接口。您可以看到实际的层次结构:
我不明白为什么 spring 不能在我的控制器中创建带@Service 注释的 bean 和自动装配它们。任何帮助将不胜感激。
我冒昧地查看了您在 github 中的项目 https://github.com/tuanalexeu/JavaSchoolFinalTask
问题是您如何初始化 spring 上下文,根本没有读取 AppConfig 上下文。此上下文包含您的所有配置。
通过修改您的初始化程序以将您的 AppConfig 包含为根,所有 bean 都应该存在于相同的上下文中。 (您也可以选择拥有父 -> 子上下文,但这也应该在初始化程序中完成)。希望能帮助到你。祝你好运。
public class MainWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(final ServletContext sc) throws ServletException {
AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
root.register(AppConfig.class);
Dynamic servlet = sc.addServlet("dispatcher", new DispatcherServlet(root));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
sc.addListener(new ContextLoaderListener(root));
sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain"))
.addMappingForUrlPatterns(null, false, "/*");
}
}