Java 绑定不匹配写入通用存储库和服务时出错

Java 绑定不匹配写入通用存储库和服务时出错,java,spring,generics,Java,Spring,Generics,我正在编写一个Spring MVC web应用程序。有三个主要的域实体:用户、项目、任务。还有一些常见的操作是在这些操作上执行的,所以我尝试编写泛型接口和抽象类来聚合常见逻辑 存在表示存储库行为的GenericRepository接口: package org.example.btracker.repository; import java.io.Serializable; import java.util.List; public interface GenericRepository&l

我正在编写一个Spring MVC web应用程序。有三个主要的域实体:用户、项目、任务。还有一些常见的操作是在这些操作上执行的,所以我尝试编写泛型接口和抽象类来聚合常见逻辑

存在表示存储库行为的GenericRepository接口:

package org.example.btracker.repository;

import java.io.Serializable;
import java.util.List;

public interface GenericRepository<E, K extends Serializable> {
    K save(E entity);
    List<E> findSeveralById(K id);
    E findOneById(K id);
    K update(E changedEntity);
    void delete(K id);
}
package org.example.btracker.service;

import java.io.Serializable;
import java.util.List;

public interface GenericService<E, K extends Serializable> {
    K create(E entity);
    List<E> getAll(K id);
    E getOne(K id);
    K update(E changedEntity);
    void delete(K id);
}
package org.example.btracker.repository;
导入java.io.Serializable;
导入java.util.List;
公共接口通用存储库{
K save(E实体);
列出findSeveralById(K id);
E findOneById(K id);
K更新(E变更);
无效删除(K id);
}
在AbstractGenericRepository中实现了共享逻辑:

package org.example.btracker.repository;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

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

@SuppressWarnings("unchecked")
public abstract class AbstractGenericRepository<E, K extends Serializable> implements GenericRepository<E, K> {

    @Autowired
    private SessionFactory sessionFactory;

    protected Session session;

    protected Class<E> type;


    public AbstractGenericRepository() {
        Type t = getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType) t;
        type = (Class<E>) pt.getActualTypeArguments()[0];

        session = getSession();
    }

    //method implementation omitted for brevity
    //implemented all but findSeveralById method which is specific for each entity

    private Session getSession() {
        return sessionFactory.getCurrentSession();
    }
}
package org.example.btracker.service;

import java.io.Serializable;
import java.util.List;

import org.example.btracker.repository.GenericRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

@Transactional
public abstract class AbstractGenericService<E, K extends Serializable, R extends GenericRepository<E, K>> implements GenericService<E, K> {

    @Autowired
    protected R repository;

    //method implementation omitted for brevity

}
package org.example.btracker.repository;
导入java.io.Serializable;
导入java.lang.reflect.ParameterizedType;
导入java.lang.reflect.Type;
导入org.hibernate.Session;
导入org.hibernate.SessionFactory;
导入org.springframework.beans.factory.annotation.Autowired;
@抑制警告(“未选中”)
公共抽象类AbstractGenericRepository实现了GenericRepository{
@自动连线
私人会话工厂会话工厂;
受保护会话;
保护类类型;
公共摘要通用存储库(){
类型t=getClass().getGenericSuperclass();
参数化类型pt=(参数化类型)t;
类型=(类)pt.getActualTypeArguments()[0];
session=getSession();
}
//为简洁起见,省略了方法实现
//实现了除findSeveralById之外的所有方法,该方法针对每个实体
私有会话getSession(){
返回sessionFactory.getCurrentSession();
}
}
每个实体有三个接口。以下是项目实体的代码:

package org.example.btracker.repository;

import org.example.btracker.domain.Project;

public interface ProjectRepository extends GenericRepository<Project, Integer> {

}
package org.example.btracker.repository;
导入org.example.btracker.domain.Project;
公共接口项目存储库扩展了GenericRepository{
}
每个实体都有上述接口的具体实现。以下是具有findSeveralById方法特定实现的项目实体的代码:

package org.example.btracker.repository;

import java.util.List;

import org.example.btracker.domain.Project;

public class ProjectRepositoryImpl extends AbstractGenericRepository<Project, Integer> implements ProjectRepository {

    @Override
    public List<Project> findSeveralById(Integer id) {
        //TODO write an implementation
        return null;
    }
}
package org.example.btracker.repository;
导入java.util.List;
导入org.example.btracker.domain.Project;
公共类ProjectRepositoryImpl扩展了AbstractGenericRepository实现了ProjectRepository{
@凌驾
公共列表findSeveralById(整数id){
//TODO编写一个实现
返回null;
}
}
有一个表示常见服务行为的GenericService接口:

package org.example.btracker.repository;

import java.io.Serializable;
import java.util.List;

public interface GenericRepository<E, K extends Serializable> {
    K save(E entity);
    List<E> findSeveralById(K id);
    E findOneById(K id);
    K update(E changedEntity);
    void delete(K id);
}
package org.example.btracker.service;

import java.io.Serializable;
import java.util.List;

public interface GenericService<E, K extends Serializable> {
    K create(E entity);
    List<E> getAll(K id);
    E getOne(K id);
    K update(E changedEntity);
    void delete(K id);
}
package org.example.btracker.service;
导入java.io.Serializable;
导入java.util.List;
公共接口通用服务{
K创建(E实体);
列表getAll(K-id);
E getOne(K id);
K更新(E变更);
无效删除(K id);
}
还有一个抽象服务,其中实现了共享逻辑:

package org.example.btracker.repository;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

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

@SuppressWarnings("unchecked")
public abstract class AbstractGenericRepository<E, K extends Serializable> implements GenericRepository<E, K> {

    @Autowired
    private SessionFactory sessionFactory;

    protected Session session;

    protected Class<E> type;


    public AbstractGenericRepository() {
        Type t = getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType) t;
        type = (Class<E>) pt.getActualTypeArguments()[0];

        session = getSession();
    }

    //method implementation omitted for brevity
    //implemented all but findSeveralById method which is specific for each entity

    private Session getSession() {
        return sessionFactory.getCurrentSession();
    }
}
package org.example.btracker.service;

import java.io.Serializable;
import java.util.List;

import org.example.btracker.repository.GenericRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

@Transactional
public abstract class AbstractGenericService<E, K extends Serializable, R extends GenericRepository<E, K>> implements GenericService<E, K> {

    @Autowired
    protected R repository;

    //method implementation omitted for brevity

}
package org.example.btracker.service;
导入java.io.Serializable;
导入java.util.List;
导入org.example.btracker.repository.GenericRepository;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.transaction.annotation.Transactional;
@交易的
公共抽象类AbstractGenericService实现GenericService{
@自动连线
受保护的R库;
//为简洁起见,省略了方法实现
}
每个实体有三个接口。以下是具有特定联接方法签名的项目实体的代码:

package org.example.btracker.service;

import org.example.btracker.dto.ProjectDto;

public interface ProjectService extends GenericService<ProjectDto, Integer> {
    Integer join(Integer id);
}
package org.example.btracker.service;
导入org.example.btracker.dto.ProjectDto;
公共接口ProjectService扩展了GenericService{
整数连接(整数id);
}
上述接口有三个具体实现。以下是具有连接方法实现的项目实体的代码:

package org.example.btracker.service;

import org.example.btracker.dto.ProjectDto;
import org.example.btracker.repository.ProjectRepository;
import org.example.btracker.repository.ProjectRepositoryImpl;
import org.springframework.stereotype.Service;

@Service
public class ProjectServiceImpl extends AbstractGenericService<ProjectDto, Integer, ProjectRepository> implements ProjectService {

    @Override
    public Integer join(Integer id) {
        // TODO write an implementation
        return null;
    }
}
package org.example.btracker.service;
导入org.example.btracker.dto.ProjectDto;
导入org.example.btracker.repository.ProjectRepository;
导入org.example.btracker.repository.ProjectRepositoryImpl;
导入org.springframework.stereotype.Service;
@服务
公共类ProjectServiceImpl扩展了AbstractGenericService实现了ProjectService{
@凌驾
公共整数联接(整数id){
//TODO编写一个实现
返回null;
}
}
在ProjectServiceImpl类中,我得到一个错误:

Bound mismatch: The type ProjectRepository is not a valid substitute for the bounded parameter <R extends GenericRepository<E,K>> of the type AbstractGenericService<E,K,R>
绑定不匹配:类型ProjectRepository不是AbstractGenericService类型的绑定参数的有效替代品
我不明白怎么了。请告知! 提前感谢。

您定义了:

public class ProjectServiceImpl extends AbstractGenericService<ProjectDto, Integer, ProjectRepository>
public abstract class AbstractGenericService<E, K extends Serializable, R extends GenericRepository<E, K>>
所以你的
E
类型是
Project
,你的
K
类型是
Integer

但是
在您的
projectserviceinpl
中,您的
E
类型是
ProjectDto
,而不是
Project