Spring репозиторий MVC, как автоматическое подключение через интерфейсы и достижения конкретных реализаций репозитория с контроллера? - PullRequest
0 голосов
/ 24 ноября 2018

Доброе утро,

Я создаю веб-приложение, и я решил сделать это с помощью пружинного MVC на основе аннотаций с REST Webservices (Джексон).

Я не использую Spring-Boot, потому что я хотел добавлять библиотеки постепенно, когда они мне нужны.

Когда я пытаюсь добраться до своего конкретного хранилища с помощью String str = ((GroupeMaterielRepository) repository).test();, я получаю

java.lang.ClassCastException: com.sun.proxy. $ Proxy210 нельзя преобразовать в pro.logikal.gestsoft.repository.GroupeMaterielRepository]

Я хотел бы узнать, какдоступ к моим конкретным методам репозитория, в которых будут храниться мои HQL-запросы.Я пытаюсь найти решение в течение нескольких дней без успеха.Лучшее, что я мог сделать до сих пор, - это получить доступ к моим методам CRUD в реализации универсального репозитория, но это подразумевает сохранение в моем интерфейсе репозитория каждого метода HQL в приложении, что приведет к ужасному результату.

Я хотел бы, чтобы вы хотеличтобы помочь мне заставить этот код работать, сохраняя логику автоматического подключения через реализации интерфейса, расширенные более специфическим классом с уровнем контроллера и уровнем хранилища.

Общий контроллер:

package pro.logikal.gestsoft.controller;

import pro.logikal.gestsoft.repository.GenericCRUD;

public class GenericRestController<T> {

    protected GenericCRUD<T> repository;

    public GenericRestController(GenericCRUD<T> repository) {
        this.repository = repository;
    }

    public GenericCRUD<T> getRepository() {
        return repository;
    }



}

Определенный контроллер:

package pro.logikal.gestsoft.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import pro.logikal.gestsoft.entity.GroupeMateriel;
import pro.logikal.gestsoft.repository.GenericCRUD;
import pro.logikal.gestsoft.repository.GroupeMaterielRepository;

@RestController
public class MaterielRESTController extends GenericRestController<GroupeMateriel> {


    @Autowired
    public MaterielRESTController(GenericCRUD<GroupeMateriel> repository) {
        super(repository);
        // TODO Auto-generated constructor stub
    }


    @GetMapping("/mat/groupes")
    public ResponseEntity<String> getGroupes(){

        String str = ((GroupeMaterielRepository) repository).test();

        return new ResponseEntity<String>(str, HttpStatus.OK);
    }



}

Интерфейс репозитория:

package pro.logikal.gestsoft.repository;

import java.util.List;

public interface GenericCRUD<T> {

    void create(T entity);

    void update(T entity);

    void refresh(T entity);

    void delete(Integer id);

    T find (Integer id);

    List<T> list();

}

Реализация репозитория:

package pro.logikal.gestsoft.repository;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.transaction.annotation.Transactional;

import pro.logikal.gestsoft.statics.ClientRequestUtils;
import pro.logikal.gestsoft.statics.DatabaseUtils;

@SuppressWarnings("unchecked")
@Transactional(DatabaseUtils.TM_GESTSOFT)
public class GenericCRUDImpl<T> implements GenericCRUD<T> {


    @SuppressWarnings("unused")
    public final Class<T> persistentClass;

    @Autowired
    @Qualifier(DatabaseUtils.GESTSOFT_SESSION)
    public SessionFactory sessionFactory;

    protected Session getCurrentSession() {
        Session session = sessionFactory.getCurrentSession();
        return session;
    }

    public GenericCRUDImpl(){
        this.persistentClass= (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }


    @Override
    public void create(final T entity) {
        this.getCurrentSession().save(entity);

    }

    @Override
    public void update(final T entity) {
        this.getCurrentSession().update(entity);

    }

    @Override
    public void refresh(final T entity) {
        this.getCurrentSession().refresh(entity);

    }

    @Override
    public void delete(Integer id) {
        this.getCurrentSession().delete(this.find(id));

    }

    @Override
    public T find(Integer id) {
        // TODO Auto-generated method stub
        return this.getCurrentSession().get(persistentClass, id);
    }


    @Override
    public List<T> list() {
        return this.getCurrentSession().createQuery("from "+persistentClass.getTypeName()).getResultList();
    }

}

Репозиторий, связанный с сущностью и который должен содержать HQLЗапросы для связанных лиц:

package pro.logikal.gestsoft.repository;

import org.springframework.stereotype.Repository;

import pro.logikal.gestsoft.entity.GroupeMateriel;

@Repository
public class GroupeMaterielRepository extends GenericCRUDImpl<GroupeMateriel> {


    public String test() {
        return "ok";
    }

}

1 Ответ

0 голосов
/ 24 ноября 2018

Только что узнал, откуда возникла моя проблема, прочитав [https://stackoverflow.com/a/6512431/8822802][1]

в моем случае @EnableAspectJAutoProxy(proxyTargetClass = true) в моем конфигурационном файле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...