How do I get spring to enter my EntityManager?

I follow the manual here , but when the DAO is executed, EntityManagerthere is null.

I tried a number of corrections that I found in the comments to the manual, in various forums and here (including this ), to no avail. Whatever it seems to me EntityManagerremains null.

Here are the relevant files, with packages, etc. modified to protect the innocent.

spring -context.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:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
        xmlns:p="http://www.springframework.org/schema/p">

     <context:component-scan base-package="com.group.server"/>
     <context:annotation-config/>
     <tx:annotation-driven/>

     <bean id="propertyPlaceholderConfigurer"
           class="com.group.DecryptingPropertyPlaceholderConfigurer"
           p:systemPropertiesModeName="SYSTEM_PROPERTIES_MODE_OVERRIDE">
         <property name="locations">
             <list>
                 <value>classpath*:spring-*.properties</value>
                 <value>classpath*:${application.environment}.properties</value>
             </list>
         </property>
     </bean>

     <bean id="orderDao" class="com.package.service.OrderDaoImpl"/>

     <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
         <property name="persistenceUnitName" value="MyServer"/>
         <property name="loadTimeWeaver">
             <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
         </property>
         <property name="dataSource" ref="dataSource"/>
         <property name="jpaVendorAdapter">
             <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                 <property name="showSql" value="${com.group.server.vendoradapter.showsql}"/>
                 <property name="generateDdl" value="${com.group.server.vendoradapter.generateDdl}"/>
                 <property name="database" value="${com.group.server.vendoradapter.database}"/>
             </bean>
         </property>
     </bean>

     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
         <property name="entityManagerFactory" ref="entityManagerFactory"/>
         <property name="dataSource" ref="dataSource"/>
     </bean>

     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
         <property name="driverClassName" value="${com.group.server.datasource.driverClassName}"/>
         <property name="url" value="${com.group.server.datasource.url}"/>
         <property name="username" value="${com.group.server.datasource.username}"/>
         <property name="password" value="${com.group.server.datasource.password}"/>
     </bean>

     <bean id="executorService" class="java.util.concurrent.Executors" factory-method="newCachedThreadPool"/>

 </beans>

persistence.xml

<persistence  xmlns="http://java.sun.com/xml/ns/persistence"  version="1.0">
    <persistence-unit name="MyServer" transaction-type="RESOURCE_LOCAL"/>
</persistence>

OrderDaoImpl

 package com.group.service;

 import com.group.model.Order;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;

 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.persistence.Query;
 import java.util.List;

 @Repository
 @Transactional
 public class OrderDaoImpl implements OrderDao {

     private EntityManager entityManager;

     @PersistenceContext
     public void setEntityManager(EntityManager entityManager) {
         this.entityManager = entityManager;
     }

     @Override
     public Order find(Integer id) {
         Order order = entityManager.find(Order.class, id);
         return order;
     }

     @Override
     public List<Order> findAll() {
         Query query = entityManager.createQuery("select o from Order o");
         return query.getResultList();
     }

     @Override
     public List<Order> findBySymbol(String symbol) {
         Query query = entityManager.createQuery("select o from Order o where o.symbol = :symbol");
         return query.setParameter("symbol", symbol).getResultList();
     }
 }
+3
source share
3 answers

unitName="MyServer" @PersistenceContext?

+2

org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.

+1

just a thought ... you have this entry in web.xml

<servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/META-INF/spring-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>

this will load your spring context and all objects will be entered by the spring container ... just try if you missed it ...

0
source

Source: https://habr.com/ru/post/1740073/


All Articles