2017-02-06 3 views
1

私はSpringMVC + Hibernateでジェネリックを使用していますが、エラーを投げます。私はそれを解決しようとしていますが、誰も問題の理由を知っていません。ここ は私のコードです:GenericsDAO + SpringMVC + Hibernateエラーを使用してください。

public interface GenericDAO <E, K> { 

public void save(E entity); 
public List<E> findAll(); 
public void update(E entity); 
public void delete(E entity); 
public E find(K key); 
} 

@Transactional 
@Repository 
public abstract class GenericDAOImpl<E, K extends Serializable> implements GenericDAO<E, K>{ 

@Autowired 
private SessionFactory sessionFactory; 

protected Class<? extends E> daoType; 

public GenericDAOImpl() { 
    Type type = getClass().getGenericSuperclass(); 
    ParameterizedType parameterizedType = (ParameterizedType) type; 

} 

protected Session currentSession(){ 
    return sessionFactory.getCurrentSession(); 
} 

@Override 
public void save(E entity) { 
    currentSession().save(entity); 
} 

@SuppressWarnings("deprecation") 
@Override 
public List<E> findAll() { 
    return currentSession().createCriteria(daoType).list(); 
} 

@Override 
public void update(E entity) { 
    currentSession().saveOrUpdate(entity); 
} 

@Override 
public void delete(E entity) { 
    currentSession().delete(entity); 
} 

@Override 
public E find(K key) { 
    return (E)currentSession().get(daoType, key); 
} 
} 


public interface GenericService <E, K>{ 

public void save(E entity); 
public List<E> findAll(); 
public void update(E entity); 
public void delete(E entity); 
public E find(K key); 
} 

@Service 
public abstract class GenericServiceImpl<E, K> implements GenericService<E, K> { 

private GenericDAO<E, K> genericDAO; 

public GenericServiceImpl() { 
} 

public GenericServiceImpl(GenericDAO<E, K> genericDAO){ 
    this.genericDAO = genericDAO; 
} 

@Override 
@Transactional(propagation = Propagation.REQUIRED) 
public void save(E entity) { 
    genericDAO.save(entity); 
} 

@Override 
@Transactional(propagation = Propagation.REQUIRED, readOnly = true) 
public List<E> findAll() { 
    return genericDAO.findAll(); 
} 

@Override 
@Transactional 
public void update(E entity) { 
    genericDAO.update(entity); 
} 

@Override 
@Transactional 
public void delete(E entity) { 
    genericDAO.delete(entity); 
} 

@Override 
@Transactional(propagation = Propagation.REQUIRED, readOnly = true) 
public E find(K key){ 
    return genericDAO.find(key); 
} 
} 

public interface MoviesDAO extends GenericDAO<Movies, Integer> { 
} 

@Transactional 
@Repository 
public class MoviesDAOImpl extends GenericDAOImpl<Movies, Integer> implements MoviesDAO{ 
} 

public interface MoviesService extends GenericService<Movies, Integer>{ 
} 

@Service 
public class MoviesServiceImpl extends GenericServiceImpl<Movies, Integer> implements MoviesService{ 

} 

@Controller 
public class MoviesController { 

@Autowired(required = true) 
MoviesService moviesService; 

@RequestMapping("/movies") 
public String returnMovies(Model model){ 
    model.addAttribute("movies", new Movies()); 
    model.addAttribute("listMovies", moviesService.find(1)); 
    return "movies"; 
} 
} 

表示されるエラーは次のとおりです。

java.lang.NullPointerException 
    com.project.movies.service.impl.GenericServiceImpl.find(GenericServiceImpl.java:51) 
com.project.movies.controller.MoviesController.returnMovies(MoviesController.java:21) 

のcontext.xml

<tx:annotation-driven transaction-manager="transactionManager"/> 
<mvc:annotation-driven/>  
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/DataBaseBD" /> 
    <property name="username" value="user"/> 
    <property name="password" value="password"/> 
</bean> 

<bean id="hibernate5AnnotatedSessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="annotatedClasses"> 
     <list> 
      <value>com.project.movies.model.Movies</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="hibernate5AnnotatedSessionFactory" /> 
</bean> 
+0

あなたは 'SessionFactory' beanを設定しているところであなたの設定を表示できますか? – Naros

+0

は私がMoviesServiceImplにこのコードを追加 – Charlie

答えて

0

あなたのサービスがnullである、あなたとあなたのサービスのためのBean定義を追加しますMoviesServiceImplの完全修飾名。

.... 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/DataBaseBD" /> 
    <property name="username" value="user"/> 
    <property name="password" value="password"/> 
</bean> 

<bean id="moviesService" class="your.class.package.MoviesServiceImpl" parent="GenericService" /> 
.... 
+0

...私のコンテキストを掲示し、今私は別のエラーがあります: '@Autowired \t公共MoviesServiceImpl(MoviesDAO moviesDAO){ \t \tスーパー(moviesDAOを)。 \t} – Charlie

+0

エラー: org.hibernate.HibernateException:現在のスレッドのトランザクション同期セッションを取得できませんでした – Charlie

+0

Moviesクラスを表示できますか? – jonhid

関連する問題