当前位置: 首页 > 知识库问答 >
问题:

Spring和Spring Data JPA不能协同工作

苏嘉歆
2023-03-14

我在一个项目中使用Spring Data JPA(1.3.0.Release),并使用Spring(3.2.2.Release),遇到了一个奇怪的问题。我使用的是基于xml的配置,如下所述。

<context:annotation-config/>
<context:component-scan base-package="x.y.z.services"/> 
<jpa:repositories base-package="x.y.z.repo"/>

使用此配置扫描所有扩展JParePository的接口。这些接口按以下方式注入到服务类中。

@Service
public class UserServiceImpl implements UserService {

    private UserRepository userRepository;

    @Inject
    public void setUserRepository(UserRepository userRepository) {
            this.userRepository = userRepository;
    }

    @Override
    public List<User> listUsers() {
            return userRepository.findAll();
    }
 }

此配置按预期工作,没有任何问题。但是当我添加以下配置时,我得到了UserRepository的BeanCreationException。

    <bean id="securityRealm" class="x.y.z.Realm">
        <property name="userService">
            <bean class="x.y.z.services.UserServiceImpl"/>
        </property>
    </bean>

下面是Realm和UserRepository的Java代码。

public class Realm extends AuthorizingRealm implements IRealm {

    private UserService userService;

    @Inject
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
    AuthenticationToken token) throws AuthenticationException {
       return null;
    }

}

public interface UserRepository extends JpaRepository<User, String> {

}

Spring不能为UserRepository创建bean,因为它的实现类不可用,必须由jpa:repositories配置提供。我可以看到Spring和Spring Data JPA没有协同工作。

有人能帮我解决这个问题吗。下面是执行的stacktrace。

    2013-04-30 21:44:04.745:INFO:/web:Initializing Spring root WebApplicationContext
    2013-04-30 21:44:07,009 [ERROR] [main] [org.springframework.web.context.ContextLoader] - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilter' defined in class path resource [META-INF/Test-web/security-config.xml]: Cannot resolve reference to bean 'securityManager' while setting bean property 'securityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testShiroRealm': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: x.y.z.core.service.UserService x.y.z.core.security.testShiroRealm.userService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void x.y.z.core.service.internal.UserServiceImpl.setUserRepository(x.y.z.repo.UserRepository); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [x.y.z.repo.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:329)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1393)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1134)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
        at org.springframework.context.support.AbstractApplicationContext.registerBeantesttProcessors(AbstractApplicationContext.java:753)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
        at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
        at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:764)
        at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:406)
        at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:756)
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:242)
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1221)
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:699)
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:454)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
        at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:90)
        at org.eclipse.jetty.server.Server.doStart(Server.java:263)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
        at runjettyrun.Bootstrap.main(Bootstrap.java:80)
    ... 34 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void x.y.z.core.service.UserServiceImpl.setUserRepository(x.y.z.repo.UserRepository); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [x.y.z.repo.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:601)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
    ... 45 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [x.y.z.repo.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:986)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:558)
    ... 47 more

共有1个答案

崔绍辉
2023-03-14

这是Spring Data JPA中的bug,已经修复。请看一下JIRA问题的解决方案

https://jira.springsource.org/browse/datajpa-335

 类似资料:
  • 正在使用的技术堆栈: Java 8 MapStruct:1.2.0.最终Lombok:1.16.18 IDE:IntelliJ-Lombok插件已安装 最初,当我删除getter和setter并添加和注释时,遇到了一些问题,无法找到该属性,并显示: 我了解到Lombok 1.16.14或更新版本与MapStruct 1.2.0.beta1或更新版本是兼容的,并且可以协同工作,但我的版本比所需的版本

  • 问题内容: 我想要双向JSON到Java的序列化 我正在成功使用Java到JSON到jQuery的路径…()例如 在JQuery中,我使用 这很好用(例如,感谢所有回答者,注释已经可以使用了) 但是,我该如何做反向路径:是否已使用RequestBody将JSON序列化回Java对象? 无论我尝试什么,我都无法像这样工作: 我已经正确配置了Jackson(它会在出局时序列化),并且我将MVC设置为驱

  • 我正在创建一个用户界面,允许用户通过拖放界面创建数据库表(及其字段和关系)。 这是我创建的jsFiddle,尽管它看起来有很多事情要做,但实际上它只是演示问题所需的最低限度。以下是我的要求,jsPlumb很好地单独处理了这些要求,但是当我试图把它们放在一起时,我会遇到问题。特别是,它将#2和#3结合在一起是一个问题。 表格可以在画布上拖动(使用jsPlumb.draggable()) 表中的字段可

  • 我有一个基本的 VPC,其中包含两个运行 Apache 的 Linux EC2 实例,它们位于经典 ELB 后面。 我想从web应用程序中使用DynamoDB,这要求EC2实例具有出站互联网访问,因为DynamoDBendpoint无法通过后端获得。 我正在使用 ELB 来避免将公有 IP 附加到 EC2 实例,因此我宁愿不附加它们,以便可以访问 DynamoDB。 在这一点上,我被卡住了。 我设

  • 我有一个application.yml可以工作,并且在连接到数据库时正在使用: 向配置中添加环境配置文件时: 我得到了这个错误: org.springframework.beans.factory.beanCreationException:创建名为“demo application”的bean时出错:注入autowired依赖项失败;嵌套异常为org.springframework.beans.

  • 问题内容: 我想要双向JSON到Java的序列化 我正在 成功 使用Java到JSON到jQuery的路径…()例如 在JQuery中,我使用 这 很好用 (例如,感谢所有回答者,注释已经可以使用了) 但是,我该如何做 反向 路径:是否已使用RequestBody将JSON序列化回Java对象? 无论我尝试什么,我都无法像这样工作: 我已经正确配置了Jackson(它在出局时进行序列化),并且我将