如何在java multimodule项目中创建bean entityManagerFactoryBean?

时间:2021-02-19 15:02:02

entityManagerFactoryBean

    2016-02-13 20:38:22 WARN  XmlWebApplicationContext:546 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.filterChains': Cannot resolve reference to bean 'org.springframework.security.web.DefaultSecurityFilterChain#0' while setting bean property 'sourceList' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.DefaultSecurityFilterChain#0': Cannot resolve reference to bean 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0' while setting constructor argument with key [5]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0': Cannot resolve reference to bean 'org.springframework.security.authentication.ProviderManager#0' while setting bean property 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authentication.ProviderManager#0': Cannot resolve reference to bean 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authenticationManager': Cannot resolve reference to bean 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0' while setting constructor argument with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0': Cannot resolve reference to bean 'UserDetailsServiceImplementation' while setting bean property 'userDetailsService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserDetailsServiceImplementation' defined in ServletContext resource [/WEB-INF/spring-security.xml]: Cannot resolve reference to bean 'jpaUserDao' while setting bean property 'adminUserDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaUserDao' defined in ServletContext resource [/WEB-INF/spring-security.xml]: Cannot resolve reference to bean 'entityManagerFactoryBean' while setting bean property 'entityManagerFactoryBean'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactoryBean' is defined
2016-02-13 20:38:22 ERROR ContextLoader:353 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.filterChains': Cannot resolve reference to bean 'org.springframework.security.web.DefaultSecurityFilterChain#0' while setting bean property 'sourceList' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.DefaultSecurityFilterChain#0': Cannot resolve reference to bean 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0' while setting constructor argument with key [5]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0': Cannot resolve reference to bean 'org.springframework.security.authentication.ProviderManager#0' while setting bean property 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authentication.ProviderManager#0': Cannot resolve reference to bean 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authenticationManager': Cannot resolve reference to bean 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0' while setting constructor argument with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0': Cannot resolve reference to bean 'UserDetailsServiceImplementation' while setting bean property 'userDetailsService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserDetailsServiceImplementation' defined in ServletContext resource [/WEB-INF/spring-security.xml]: Cannot resolve reference to bean 'jpaUserDao' while setting bean property 'adminUserDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaUserDao' defined in ServletContext resource [/WEB-INF/spring-security.xml]: Cannot resolve reference to bean 'entityManagerFactoryBean' while setting bean property 'entityManagerFactoryBean'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactoryBean' is defined
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:382)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1481)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4812)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

spring-security.xml lies in web directory

spring-security.xml位于web目录中

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">

<!-- enable use-expressions -->
<http auto-config="true" use-expressions="true">

    <intercept-url pattern="/adm/**" access="hasRole('ROLE_ADMIN')" />
    <intercept-url pattern="/red/**" access="hasAnyRole('ROLE_ADMIN', 'ROLE_REDADMIN')" />
    <intercept-url pattern="/**" access="permitAll" />

    <!-- access denied page -->
    <access-denied-handler error-page="/index" />
    <form-login login-page="/login" default-target-url="/index"
        login-processing-url="/j_spring_security_check" 
        authentication-failure-url="/login?error" 
        username-parameter="email"
        password-parameter="password" />
    <logout logout-success-url="/login?logout" />
    <csrf />
</http>

<beans:bean id="UserDetailsServiceImplementation"
    class="com.softserveinc.ita.redplatform.business.service.UserDetailsServiceImplementation">
    <beans:property name="adminUserDao" ref="jpaUserDao" />
</beans:bean>

<beans:bean id="jpaUserDao" 
class="com.softserveinc.ita.redplatform.persistence.dao.impl.JPAAdminUserDao">
<beans:property name="entityManagerFactoryBean" ref="entityManagerFactoryBean"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="UserDetailsServiceImplementation">
    </authentication-provider>
</authentication-manager>

persistence-context.xml lies in persistence directory

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

    <context:component-scan base-package="com.softserveinc.ita.redplatform.persistence.dao.impl" />

    <bean id="entityManagerFactoryBean"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

        <property name="dataSource" ref="dataSource" />

        <property name="persistenceUnitName" value="JPAUnit" />

        <property name="packagesToScan">
            <list>
                <value>com.softserveinc.ita.redplatform.common.entity</value>
            </list>
        </property>

        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>

        <property name="jpaProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            </props>
        </property>
    </bean>

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

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

<!--    <bean id="jpaUserDao" class="com.softserveinc.ita.redplatform.persistence.dao.impl.JPAAdminUserDao"> -->
<!--    <property name="managerFactoryBean" ref="entityManagerFactoryBean"/> -->
<!--    </bean> -->

    <tx:annotation-driven />

</beans>

web.xml

<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"
version="3.1">


<display-name>REDplatform</display-name>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-security.xml
    </param-value>
</context-param>

<!-- Spring Security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.2.xsd">

<context:component-scan
    base-package="com.softserveinc.ita.redplatform.web.controller" />

<import resource="classpath*:**/spring/*context.xml" />
<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath*:**/properties/*properties</value>
    </property>
</bean>



<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/views/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatters">
        <set>
            <ref bean="realEstateAgencyDTOFormatter" />
        </set>
    </property>
</bean>
<mvc:annotation-driven conversion-service="conversionService" />

<mvc:resources mapping="/resources/**" location="/resources/" />

JPAAdminUserDao class have method findUserByEmail

JPAAdminUserDao类有方法findUserByEmail

   @Transactional
 public class JPAAdminUserDao extends JPAGenericDao<AdminUser, Long> 
   implements AdminUserDao {
@Autowired
private EntityManager entityManagerFactoryBean;
/**
 * 
 * @param email receiving
 * @return AdminUser object
 */
public final AdminUser findUserByEmail(final String email) {
    List<AdminUser> users = new ArrayList<AdminUser>();
    users =       (List<AdminUser>)entityManagerFactoryBean.getEntityManagerFactory().createEntityManager()
            .createQuery("from " + AdminUser.class.getName() 
                    + " as user where user.email=:email")
            .setParameter("email", email).getResultList();
    if (users.size() > 0) {
        return users.get(0);
    } else {
        return null;
    }
}
}

UserDetailsServiceImplementation

public class UserDetailsServiceImplementation implements UserDetailsService   {

/**
 * Using JPAAdminUserDao object.
 */
@Autowired
private JPAAdminUserDao jpaUserDao;

 @Override
public final UserDetails loadUserByUsername(final String username) 
        throws UsernameNotFoundException {

    HashSet<String> set = new HashSet<String>();
    AdminUser user = (AdminUser) jpaUserDao.findUserByEmail(username);
    if (user instanceof AdminUser) {
        set.add(new String("ROLE_USER"));
        set.add(new String("ROLE_ADMIN"));
        set.add(new String("ROLE_REDADMIN"));
    } else {
        set.add(new String("ROLE_USER"));
    }
    List<GrantedAuthority> authorities = buildUserAuthority(set);
    return buildUserForAuthentication(user, authorities);

}

/**
 * 
 * @param user Receiving user object
 * @param authorities Receiving list of user authorities 
 * @return returning user object 
 */
private User buildUserForAuthentication(final AdminUser user, 
        final List<GrantedAuthority> authorities) {
    return new User(user.getEmail(), user.getPassword(), true, 
            true, true, true, authorities);
}

/**
 * 
 * @param userRoles receiving
 * @return Returning list of authorities
 */
private List<GrantedAuthority> buildUserAuthority(final 
        Set<String> userRoles) {

    Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
    // Build user's authorities
    for (String userRole : userRoles) {
        setAuths.add(new SimpleGrantedAuthority(userRole));
    }
    List<GrantedAuthority> result = new 
            ArrayList<GrantedAuthority>(setAuths);

    return result;
}

public final JPAAdminUserDao getJpaUserDao() {
    return jpaUserDao;
}

public final void setAdminUserDao(final JPAAdminUserDao newJpaUserDao) {
    this.jpaUserDao = newJpaUserDao;
}
}

If i comment next line

如果我评论下一行

<beans:property name="entityManagerFactoryBean"     ref="entityManagerFactoryBean"/>

in spring-security I will have java.lang.NullPointerException in JPAAdminUserDao class in method findUserByEmail

在spring-security中,我将在方法findUserByEmail中的JPAAdminUserDao类中使用java.lang.NullPointerException

1 个解决方案

#1


0  

You seem to have problems while you are loading your spring xml beans configuration files. Your persistence-context.xml is probably never loaded.

在加载spring xml beans配置文件时,您似乎遇到了问题。您的persistence-context.xml可能永远不会被加载。

Are you sure that this line is importing the persistence-context.xml file (Remove it if it is no longer necessary, it may load some context twice) :

您确定此行正在导入persistence-context.xml文件(如果不再需要,则删除它,它可能会加载一些上下文两次):

<import resource="classpath*:**/spring/*context.xml" />

Try to add the persistence-context.xml in the context-param in your web.xml

尝试在web.xml中的context-param中添加persistence-context.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-security.xml
        **/path/to/persistence-context.xml
    </param-value>
</context-param>

To ensure that your servlet-context.xml file is correctly loaded, add an init param to your DispatcherServlet declaration in your web.xml :

要确保正确加载servlet-context.xml文件,请在web.xml中的DispatcherServlet声明中添加init参数:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/path/to/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

#1


0  

You seem to have problems while you are loading your spring xml beans configuration files. Your persistence-context.xml is probably never loaded.

在加载spring xml beans配置文件时,您似乎遇到了问题。您的persistence-context.xml可能永远不会被加载。

Are you sure that this line is importing the persistence-context.xml file (Remove it if it is no longer necessary, it may load some context twice) :

您确定此行正在导入persistence-context.xml文件(如果不再需要,则删除它,它可能会加载一些上下文两次):

<import resource="classpath*:**/spring/*context.xml" />

Try to add the persistence-context.xml in the context-param in your web.xml

尝试在web.xml中的context-param中添加persistence-context.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-security.xml
        **/path/to/persistence-context.xml
    </param-value>
</context-param>

To ensure that your servlet-context.xml file is correctly loaded, add an init param to your DispatcherServlet declaration in your web.xml :

要确保正确加载servlet-context.xml文件,请在web.xml中的DispatcherServlet声明中添加init参数:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/path/to/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>