2016-04-08 2 views
0

Я новичок в использовании базы в JAVA EE поэтому, когда я пытаюсь вызвать метод управляющего объектом он бросает java.lang.NullPointerException так Я хочу, чтобы то, что я написал это пример моей реализации даоменеджера организации не правильно введен весной и дает java.lang.NullPointerException

@Repository 
@Transactional 
public class IUserDAOImpl implements IUserDAO{ 

    @PersistenceContext 
    private EntityManager em; 

    public void addUser(User u) { 
     em.persist(u); 
    } 
} 

это моя служба

@Service 
public class IUserServiceImpl implements IUserService { 

@Autowired 
private IUserDAO dao = new IUserDAOImpl(); 

public void setDao(IUserDAO dao) { 
    this.dao = dao; 
} 

public void addUser(User u) { 
    dao.addUser(u);  
} 

это мой класс действия

public class ConnectionAction extends ActionSupport { 

User c = new User("a","b","c",11,"d",true); 

@Autowired 
public IUserService service; 


public String execute() throws Exception { 
    service.addUser(c); 
     return SUCCESS; 
} 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="struts_blank" version="2.4" 
xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
<display-name>Struts Blank</display-name> 

<filter> 
<filter-name>struts2</filter-name> 
<filter-class> 
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 
</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>struts2</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

<context-param> 
<param-name>contextConfiguration</param-name> 
<param-value>classpath:applicationContext.xml</param-value> 
</context-param> 

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

applicationContext.xml (хотя это действительно перепутались так что если вы заметили sometihng неправильно плз сказать)

<?xml version="1.0" encoding="UTF-8"?> 

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

<bean id="dao" 
class="com.iticsys.GBO.dao.IUserDAOImpl"> 
</bean> 

<bean id="service" 
class="com.iticsys.GBO.services.IUserServiceImpl"> 
<property name="dao" ref="dao"></property> 
</bean> 

<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/GBO1" /> 
<property name="username" value="root" /> 
<property name="password" value="" /> 
</bean> 

<bean id="persistenceUnitManager" 
    class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
<property name="persistenceXmlLocations"> 
<value>classpath*:META-INF/persistence.xml</value> 
</property> 
<property name="defaultDataSource" ref="dataSource"> </property> 
</bean> 

<bean id="entityManagerFactory" 
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="persistenceUnitManager" ref="persistenceUnitManager"></property> 
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" /> 
<property name="persistenceUnitName" value="persistenceUnit" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
<property name="entityManagerFactory" ref="entityManagerFactory"></property> 
</bean> 
<tx:annotation-driven transaction-manager="transactionManager" /> 
<context:annotation-config></context:annotation-config> 
<context:component-scan base-package="com.iticsys.GBO.dao" /> 
</beans> 

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
version="2.0"> 
<persistence-unit name="persistenceUnit" 
    transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 


    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/GBO1" /> 
     <property name="javax.persistence.jdbc.user" value="root" /> 
     <property name="javax.persistence.jdbc.password" value="" /> 

     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
    </properties> 
</persistence-unit> 

и огромное спасибо заранее

+0

Почему * в <собственности Name = "persistenceXmlLocations"> classpath *: META-INF/persistence.xml ... не должно быть просто ? –

+0

@Mohamed ElȜalamy Можете ли вы добавить Stacktrace исключения, пожалуйста. –

+0

@ MohamedElȜalamy Заменить '' с '' и удалите из файла 'applicationContext.xml' как декларации компонентов dao, так и' service', поскольку они уже используют весенние аннотации, и с вышеуказанным тегом они будут автоматически обнаружены. –

ответ

0

В реализации класса IUserDAOImpl вы должны создать экземпляр объекта EntityManager как

private EntityManager em = new EntityManager(/*constructor parameter if any*/);

или Вы можете присвоить ссылку на объект EntityManager, что вы можете создать в своих других подклассах, например IUserServiceImpl, ConnectionAction.

Для этого вы можете добавить метод в классе IUserDAOImpl, которые получают, что reference.like,

public void setEntityManager(EntityManager em_ref){ em = em_ref;} 
+0

, который может работать, но я хочу, чтобы он автоматически вводился пружиной. –

+0

** Проверьте это: ** [http://docs.spring.io/spring/docs/2.5.x/reference/orm.html#orm-jpa-straight] Они устанавливают эту 'частную ссылку'' set ...() '. Это означает, что вам нужно передать ссылку EntityManager, чтобы этот класс работал. Если вы этого не сделаете, это вызовет «NullPointerException». –

0
public class HibernateUtil { 

static Logger logger = Logger.getLogger(HibernateUtil.class); 

private static final String FAILED_TO_CREATE_SESSION_FACTORY_OBJECT = "Failed to create sessionFactory object."; 
private static final SessionFactory sessionFactory = buildSessionFactory(); 
private static ServiceRegistry serviceRegistry; 

private static SessionFactory buildSessionFactory() { 

try { 
    Configuration configuration = new Configuration(); 
    configuration.configure("./hibernate.cfg.xml"); 

    configuration.addAnnotatedClass(Calzz.class); 

    serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 

    return configuration.buildSessionFactory(serviceRegistry); 

} catch (Throwable ex) { 

    logger.debug(FAILED_TO_CREATE_SESSION_FACTORY_OBJECT + ex); 
    throw new ExceptionInInitializerError(ex); 
} 
} 

public static SessionFactory getSessionFactory() { 
return sessionFactory; 
} 

}

Смежные вопросы