Как внедрить сервис в абстрактный класс, используя дженерики - PullRequest
1 голос
/ 15 мая 2011

Я пытаюсь создать общий абстрактный класс обслуживания, который обеспечивает общие операции 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 и не обрезает его. Есть ли образец, которому я могу следовать?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2011

Каковы определения некоторых других типов? Такие как AbstractBaseCrudBean, BaseCrudService и т. Д.? Существует так много ошибок компиляции, что трудно понять, в чем заключается ваша корневая проблема.

Однако причина, по которой простое обобщенное объявление не обрезается, заключается в том, что не существует экземпляра для вызова методов D. Вам может понадобиться что-то вроде:

private final D dao;

А затем украсьте это с помощью @Inject @Named (поскольку после стирания у вас, вероятно, будет много DAO одного типа). Таким образом, каждая реализация DAO должна иметь уникальное строковое имя, что может иметь большое значение.

0 голосов
/ 21 декабря 2011

Вы можете попробовать использовать аннотированный метод @PostConstruct, чтобы связать переменную в базовых абстрактных классах с реальными экземплярами bean-компонентов.Эти абстрактные классы могут повлиять на реализацию основных операций CRUd.Пример кода приведен ниже.Надеюсь, я каким-то образом помог вашему запросу.

@PostConstruct public void setupService() {
    baseDao = userDao;
}
...