Spring存储库MVC如何通过接口自动装配并从控制器到达特定的存储库实现?

时间:2018-11-23 21:31:45

标签: spring spring-mvc

早上好

我正在构建一个Web应用程序,我选择了使用带有REST Webservices(杰克逊)的注释驱动的Spring MVC来实现。

我没有使用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 :(得分:0)

只需阅读[https://stackoverflow.com/a/6512431/8822802][1]

就能发现我的问题出在哪里

在我的配置文件中,以@EnableAspectJAutoProxy(proxyTargetClass = true)为例