【问题标题】:How i can inject dependencies for spring data jpa?我如何为 Spring Data jpa 注入依赖项?
【发布时间】:2017-03-10 04:15:19
【问题描述】:

我正在创建 Rest + Spring + Jpa 演示,一切正常,但是当我要注入 CartRepository 的依赖项时,它会扩展 JpaRepository,它显示以下错误,

    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cartServices': Unsatisfied dependency expressed through field 'cartRepository': No qualifying bean of type [com.xptraining.repository.CartRepository] found for dependency [com.xptraining.repository.CartRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.xptraining.repository.CartRepository] found for dependency [com.xptraining.repository.CartRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()}

我的 Bean 类 -------------->>>

package com.xptraining.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "cart")
public class Cart {

    @Id
    @GeneratedValue
    @Column(name = "cart_id")
    private long cartId;

    @Column(name = "sku_id")
    private String skuId;

    @Column(name = "representative_id")
    private String representativeId;

    @Column(name = "quantity")
    private int quantity;

    @Column(name = "prize")
    private int prize;


    public long getCartId() {
        return cartId;
    }

    public void setCartId(long cartId) {
        this.cartId = cartId;
    }

    public String getSkuId() {
        return skuId;
    }

    public void setSkuId(String skuId) {
        this.skuId = skuId;
    }

    public String getRepresentativeId() {
        return representativeId;
    }

    public void setRepresentativeId(String representativeId) {
        this.representativeId = representativeId;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int getPrize() {
        return prize;
    }

    public void setPrize(int prize) {
        this.prize = prize;
    }




}


My Controller-------->>>

    @Controller


    @RequestMapping("/cart")
    public class CartController {



        @Autowired
        CartService cartServices;
        @RequestMapping(value = "/create", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
        public @ResponseBody Status addCart(@RequestBody Cart cart) {
            try {
                cartServices.addCart(cart);
                return new Status(1, "Cart added Successfully !");
            } catch (Exception e) {
                // e.printStackTrace();
                return new Status(0, e.toString());
            }

        }
        @RequestMapping(value = "delete/{id}", method = RequestMethod.DELETE)
        public @ResponseBody Status deleteCart(@PathVariable("id") long id) {

            try {
                cartServices.deleteCart(id);
                return new Status(1, "Cart deleted Successfully !");
            } catch (Exception e) {
                return new Status(0, "Record is not Found ");
            }

        }

        my service Impl class--------------->>>

    @Transactional
    public class CartServiceImpl implements CartService {


        @Inject
        CartRepository cartRepository;

        @Override
        public Cart addCart(Cart cart) throws Exception {
            // TODO Auto-generated method stub
            return cartRepository.save(cart);
        }
        @Override
        public void deleteCart(long id) throws Exception {
            // TODO Auto-generated method stub
            cartRepository.delete(id);
        }
    }


    My Repository------------------->>>>

    package com.xptraining.repository;

    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    import org.springframework.transaction.annotation.Transactional;
    import com.xptraining.model.Cart;


    @Repository
    @Transactional
    public interface CartRepository extends JpaRepository<Cart, Long>
    {

    }

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>xptraining</display-name>
      <servlet>
      <servlet-name>mvc-dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>/WEB-INF/rest.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
     </servlet>

     <servlet-mapping>
      <servlet-name>mvc-dispatcher</servlet-name>
      <url-pattern>/</url-pattern>
     </servlet-mapping>

    </web-app>

    rest.xml




   <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:util="http://www.springframework.org/schema/util" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd  
      http://www.springframework.org/schema/data/jpa 
      http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

      <context:component-scan base-package="com.xptraining.controller" />
      <jpa:repositories base-package="com.xptraining.repository"></jpa:repositories>
    <!-- <jpa:repositories base-package="com.xptraining.repository"
                      entity-manager-factory-ref="cartRepository"
                      transaction-manager-ref="transactionManager"/>  -->

        <mvc:annotation-driven />

        <bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/training" />
            <property name="username" value="root" />
            <property name="password" value="xpointers" />
        </bean>

        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="annotatedClasses">
                <list>
                    <value>com.xptraining.model.Product</value>
                    <value>com.xptraining.model.Specialties</value>
                    <value>com.xptraining.model.Representative</value>
                    <value>com.xptraining.model.Cart</value>
                    <value>com.xptraining.model.Sku</value>
                    <value>com.xptraining.model.Order</value>
                </list>
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                </props>
            </property>
        </bean>

        <bean id="txManager"
            class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>

        <bean id="persistenceExceptionTranslationPostProcessor"
            class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

        <bean id="dataDao" class="com.xptraining.dal.impl.DataDaoImpl"></bean>
        <bean id="dataServices" class="com.xptraining.services.impl.DataServicesImpl"></bean>
        <bean id="specialtiesDao" class="com.xptraining.dal.impl.SpecialtiesDaoImpl"></bean>
        <bean id="specialtiesServices" class="com.xptraining.services.impl.SpecialtiesServicesImpl"></bean>
        <bean id="representativeDao" class="com.xptraining.dal.impl.RepresentativeDaoImpl"></bean>
        <bean id="representativeService" class="com.xptraining.services.impl.RepresentativeServiceImpl"></bean>
        <bean id="skuDao" class="com.xptraining.dal.impl.SkuDaoImpl"></bean>
        <bean id="skuServices" class="com.xptraining.services.impl.SkuervicesImpl"></bean>
        <bean id="cartDao" class="com.xptraining.dal.impl.CartDaoImpl"></bean>
        <bean id="cartServices" class="com.xptraining.services.impl.CartServiceImpl"></bean>
        <bean id="orderDao" class="com.xptraining.dal.impl.OrderDaoImpl"></bean>
        <bean id="orderServices" class="com.xptraining.services.impl.OrderServicesImpl"></bean>

    </beans>

CartDaoImpl---------------->>>>>>

package com.xptraining.dal.impl;

import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import com.xptraining.dal.CartDao;
import com.xptraining.model.Cart;
/**
 * Cart DAL Implementation Class
 *
 * @author Harshad Kenjale
 * 
 */
public class CartDaoImpl implements CartDao {

    @Autowired
    SessionFactory sessionFactory;

    Session session = null;
    Transaction tx = null;

    /**
     * Get All Cart
     * 
     * @throws Exception
     * @return All Cart List
     */

    @SuppressWarnings("unchecked")
    @Override
    public List<Cart> getCartList() throws Exception {
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        List<Cart> cartList = session.createCriteria(Cart.class).list();
        tx.commit();
        session.close();
        return cartList;
    }

    /**
     * Add Cart
     * 
     * @param Cart
     * @throws Exception
     * @return boolean TRUE or FALSE
     */
    @Override
    public boolean addCart(Cart cart) throws Exception {
        // TODO Auto-generated method stub
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        session.save(cart);
        tx.commit();
        session.close();

        return false;
    }

    /**
     * Delete Cart
     * 
     * @param id
     *            Cart id
     * @throws Exception
     * @return boolean TRUE or FALSE
     */
    @Override
    public boolean deleteCart(long id) throws Exception {
        session = sessionFactory.openSession();
        Object o = session.load(Cart.class, id);
        tx = session.getTransaction();
        session.beginTransaction();
        session.delete(o);
        tx.commit();
        return false;
    }

    /**
     * Update Cart
     * 
     * @param Cart
     * @throws Exception
     * @return boolean TRUE or FALSE
     */
    @Override
    public boolean updateCart(Cart cart) throws Exception {
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        session.saveOrUpdate(cart);
        tx.commit();
        session.close();

        return false;
    }
}

【问题讨论】:

  • 确保为您的 CartRepository 定义 @Bean。你是如何定义你的 bean 的?
  • 请检查我发布的问题。谢谢

标签: spring hibernate spring-mvc spring-data-jpa


【解决方案1】:

问题就在这里:

您正在尝试将sessionFactory 传递给entity-manager-factory-ref。这导致错误为:

 Error creating bean with name '(inner bean)#542901d0': Unsatisfied dependency expressed through method 'createSharedEntityManager' parameter 0: Could not convert argument value of type [org.hibernate.internal.SessionFactoryImpl] to required type [javax.persistence.EntityManagerFactory]: Failed to convert value of type [org.hibernate.internal.SessionFactoryImpl] to required type [javax.persistence.EntityManagerFactory]; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.hibernate.internal.SessionFactoryImpl] to required type [javax.persistence.EntityManagerFactory]: no matching editors or conversion strategy found

要解决这个问题,请像这样更改您的配置文件:

添加这个 bean 声明:

<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <!-- This makes /META-INF/persistence.xml is no longer necessary -->
      <property name="packagesToScan" value="com.xptraining.model" />
      <!-- JpaVendorAdapter implementation for Hibernate EntityManager.
           Exposes Hibernate's persistence provider and EntityManager extension interface -->
      <property name="jpaVendorAdapter">
         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
      </property>
      <property name="jpaProperties">
         <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
         </props>
      </property>
   </bean>

然后将 jpa repositories 标签更改为指向这个 bean:

  <jpa:repositories base-package="com.xptraining.repository"
                  entity-manager-factory-ref="entityManagerFactoryBean"
                  transaction-manager-ref="txManager"/>

这应该可以解决您的问题。

要解决 Hibernate 验证器问题,请将其添加到您的 pom.xml 文件中:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.4.0.Final</version>
    </dependency>

您可以像这样在 XML 中启用事务:

<tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>

【讨论】:

  • Hiii,它的工作谢谢,但我仍然没有得到显示以下错误的输出.....javax.validation.ValidationException:无法创建配置,因为没有 Bean 验证提供程序可能成立。将像 Hibernate Validator (RI) 这样的提供程序添加到您的类路径中。
  • 错误消失了谢谢,但是当我要发送实体 obj (cartRepository.save(cart)) 以将方法从 CartServiceImpl 保存到 Cart Repository 时,我收到了成功响应消息但数据没有插入数据库,也没有显示任何错误。
  • @HarshadKEnjale,您有@Transactional 注释,但在spring xml 文件中,您需要启用事务。更新了我的答案,你可以在那里查看
  • 是的,但是当我从 cartDao.getCartList(); 发送请求时,我们必须设法与数据库交互;并将它发送到 CartDao 那个时候得到输出但是当我向 cartRepository.save(cart); 发送请求时即我们的 jpa ,那时我们无法与数据库交互,但也得到了成功的消息。我更新了有问题的 CartDaoImpl 。谢谢...!!!
  • Hiii,我把 放在我的 rest.xml 中,但它显示了以下错误--- ------------------>>>> 元素“tx:annotation-driven”的前缀“tx”未绑定。谢谢
【解决方案2】:

我相信您在 rest.xml 文件中缺少 jpa:repositories 标记。这有助于查找 Spring Data 存储库。

假设您的存储库在包 com.acme.repositories 中,标签看起来像

<jpa:repositories base-package="com.acme.repositories" />

请参阅http://docs.spring.io/spring-data/jpa/docs/1.4.1.RELEASE/reference/html/jpa.repositories.html 了解更多信息。

【讨论】:

  • 嗨,我按照文档放它仍然显示相同的错误。谢谢
  • 你能把&lt;context:component-scan base-package="com.xptraining.controller" /&gt;改成&lt;context:component-scan base-package="com.xptraining" /&gt;吗?我相信它目前仅扫描控制器包中的 bean,而不是存在 bean 的其他包。
  • 它显示以下错误 ------>>>>org.springframework.beans.factory.UnsatisfiedDependencyException: Error created bean with name '(inner bean)#222e3d6a': Unsatisfied dependency 谢谢
【解决方案3】:

使用这个配置:

<jpa:repositories base-package="com.xptraining.repository"
                  entity-manager-factory-ref="sessionFactory"
                  transaction-manager-ref="txManager"/>

仔细查看sessionFactorytxManager

【讨论】:

  • Hiii,仍然显示以下错误,原因:org.springframework.beans.factory.UnsatisfiedDependencyException:
  • 我可以和你分享我的项目吗?
  • 你可以在这里分享。
  • 顺便把@Service 放在你的 CartServiceImpl 类中。
【解决方案4】:

您当前的项目结构无效。应该是

src 
  +- main
      +- java
         +- com
            +- xptraining
               +- config
               +- controller
               +- dal
               +- model
               +- repository
               +- services
  +- resources
  +- webapp
      +- META-INF
      +- WEB-INF

请更正您的项目结构并重新构建它。

【讨论】:

  • Hiii,我创建了上述结构,但仍然报错,drive.google.com/open?id=0B95P-pJbv8cjRlFKUVNKU3FyM28 谢谢..!!
  • 相关原因:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“(内部 bean)#1a4a7c05”的 bean 时出错:通过方法“createSharedEntityManager”参数 0 表示的依赖关系不满足:无法转换参数[org.hibernate.internal.SessionFactoryImpl] 类型的值到所需类型 [javax.persistence.EntityManagerFactory] ​​的值:无法将 [org.hibernate.internal.SessionFactoryImpl] 类型的值转换为所需类型 [javax.persistence.EntityManagerFactory];
猜你喜欢
  • 2012-08-22
  • 2023-03-13
  • 2019-07-28
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2014-08-22
  • 2018-03-01
相关资源
最近更新 更多