Доброе утро,
Я создаю веб-приложение, и я решил сделать это с помощью пружинного 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";
}
}