Spring MVC 3.2.3 および Hibernate 4.2.1 アプリケーションを作成していますが、そのアーキテクチャを開始したばかりです。多くの一般的な CRUD 操作を使用するため、Generic Dao パターンを使用することにしました。JPA がしばらく前から存在していたことは知っていますが、汎用の dao パターンを使用してこれを実現したいと思っています。問題自体に。物事をセットアップしてWITH ONE ENTITYをテストすると、すべてがうまくいきました。しかし、2 つ目を追加するとすぐに、エラーが表示され始めました。
「タイプ [com.segurosweb.daos.GenericDao] の適格な Bean が定義されていません: 単一の一致する Bean が予想されますが、2 つ見つかりました: cobradorDaoImpl,productorDaoImpl」.
これは、Spring が起動時にどのコンポーネントを注入するかを判断できないためであることは理解していますが、これを解決する方法はわかりません。
私が使用したジェネリック DAO 実装は次のとおりです。
GenericDao.java
package com.segurosweb.daos;
import java.util.List;
public interface GenericDao<T> {
public void saveOrUpdate(T dom);
public List<T> getAll();
public T get(long id);
}
GenericDaoImpl.java
package com.segurosweb.daos;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@SuppressWarnings("unchecked")
@Repository
public abstract class GenericDaoImpl<T> implements GenericDao<T>{
private Class<T> type;
@Autowired
private SessionFactory sessionFactory;
@SuppressWarnings("rawtypes")
public GenericDaoImpl(){
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
type = (Class) pt.getActualTypeArguments()[0];
}
public Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
... all other implementation...
}
CobradorDao.java
package com.segurosweb.daos;
import com.segurosweb.entities.Cobrador;
public interface CobradorDao extends GenericDao<Cobrador>{
}
CobradorDaoImpl.java
package com.segurosweb.daos;
import org.springframework.stereotype.Repository;
import com.segurosweb.entities.Cobrador;
@Repository
public class CobradorDaoImpl extends GenericDaoImpl<Cobrador> implements CobradorDao{
}
GenericService.java
package com.segurosweb.service;
import java.util.List;
public interface GenericService<T> {
public void saveOrUpdate(T dom);
public List<T> getAll();
public T get(long id);
}
GenericServiceImpl.java
package com.segurosweb.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.segurosweb.daos.GenericDao;
public class GenericServiceImpl<T> implements GenericService<T>{
@Autowired
private GenericDao<T> tDao;
@Override
public void saveOrUpdate(T dom) {
tDao.saveOrUpdate(dom);
}
@Override
public List<T> getAll() {
return tDao.getAll();
}
@Override
public T get(long id) {
return tDao.get(id);
}
}
CobradorService.java
package com.segurosweb.service;
import com.segurosweb.entities.Cobrador;
public interface CobradorService extends GenericService<Cobrador>{
}
CobradorServiceImpl.java
package com.segurosweb.service;
import org.springframework.stereotype.Service;
import com.segurosweb.entities.Cobrador;
@Service
public class CobradorServiceImpl extends GenericServiceImpl<Cobrador> implements CobradorService{
}
そして、すべてが機能する (または機能しない!) ことをテストするための非常に単純な URL マッピングを持つコントローラー。
package com.segurosweb.controllers;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.segurosweb.entities.Cobrador;
import com.segurosweb.service.CobradorService;
@Controller
@RequestMapping("/cobradores/**")
public class CobradorController {
static final Logger log = LogManager.getLogger(CobradorController.class.getSimpleName());
@Autowired
private CobradorService cobServ;
@RequestMapping(value="view.html",method = RequestMethod.GET)
public ModelAndView setUpForm(ModelMap model){
log.info("cobradores/view.html hitted.");
cobServ.saveOrUpdate(new Cobrador("emi","lio","hola","321"));
return new ModelAndView("/secure/Productores");
}
}
Cobrador.java は、@Entity アノテーションが付けられた非常に単純な POJO クラスです。
また、Productor と呼ばれる別のエンティティ (ProductorDao、ProductorDaoImpl、ProductorService、ProductorServiceImpl) の対応するインターフェイスと実装もあります。
私が得ている正確なエラーは次のとおりです。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cobradorController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.segurosweb.service.CobradorService com.segurosweb.controllers.CobradorController.cobServ; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cobradorServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.segurosweb.daos.GenericDao com.segurosweb.service.GenericServiceImpl.tDao; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.segurosweb.daos.GenericDao] is defined: expected single matching bean but found 2: cobradorDaoImpl,productorDaoImpl
それで、ここで重要な何かが欠けていますか?veeeeeeeeeeeeeeeeeeeery 悪い考えだと皆さんが私に言わない限り、私は今のところ、このジェネリック DAO パターンに固執したいと思います。
皆さんが私に与えることができる助けを前もって感謝します!