Я пытаюсь создать общий абстрактный класс обслуживания, который обеспечивает общие операции crud для моего уровня обслуживания, объединяя объекты уровня обслуживания (DTO?), Объекты уровня данных и соответствующие им DAO.
Уровень DAO - это стандартная абстракция, в которой мои DAO расширяют AbstractJpaImpl:
@Repository
public abstract class AbstractJpaBaseDaoImpl<K extends Serializable, E> implements BaseDao<K, E> {
//Dao implementation
}
DAO расширяют этот класс и реализуют свой соответствующий интерфейс dao, который расширяет BaseDao.
Я хотел бы создать нечто подобное в своем слое обслуживания, но как бы я внедрил сам дао?
public abstract class AbstractBaseCrudServiceImpl<K extends Serializable, B extends AbstractBaseCrudBean, P, D extends AbstractJpaBaseDaoImpl<K,P>>
implements BaseCrudService<K, B> {
protected Class<B> businessObject;
protected Class<P> persistObject;
protected Class<D> dao;
@SuppressWarnings("unchecked")
public AbstractBaseCrudServiceImpl() {
//Extract the class type by accessing this classes parameters by index <0,1...> so 0 is K and 1 is E.
this.businessObject = (Class<B>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
this.persistObject = (Class<P>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[2];
this.dao = (Class<D>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[3];
}
//stuff ...
@Transactional
@SuppressWarnings("unchecked")
@Override
public void remove(B businessObject) {
logger.debug("Remove " + getBusinessObjectCanonicalName() + " id= " + businessObject.getId());
try {
getDao().remove(businessObject.getId()); //DOES NOT RECOGNIZE REMOVE METHOD
} catch (Exception e) {
logger.error("Unable to delete " + getBusinessObjectCanonicalName() + " record id=" + businessObject.getId(), e);
}
}
//stuff ...
}
Какой самый простой способ внедрить службу в этот реферат с использованием обобщений?
D расширяет AbstractJpaBaseDaoImpl и не обрезает его. Есть ли образец, которому я могу следовать?