12

現在、VariableService@Autowired私のコントローラーにあります。

このエラーをなくすためにクラスを実装できることはParameterizedTypeわかっていますが、間違った方向に向かっているのではないかと心配しています。これを行うためのより良い方法はありますか、それとも弾丸を噛んでParameterizedTypeのメソッドを実装する必要がありますか?

org.springframework.beans.factory.BeanCreationException:「contentController」という名前のBeanの作成中にエラーが発生しました:自動配線された依存関係の挿入に失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:フィールドを自動配線できませんでした:private com.fettergroup.cmt.service.VariableService com.fettergroup.cmt.web.ContentController.variableService; ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:ServletContextリソース[/WEB-INF/dispatcher-servlet.xml]で定義された「variableService」という名前のBeanの作成中にエラーが発生しました:Beanのインスタンス化に失敗しました。ネストされた例外はorg.springframework.beans.BeanInstantiationExceptionです:Beanクラスをインスタンス化できませんでした[com.fettergroup.cmt.service.VariableService]:コンストラクターが例外をスローしました。ネストされた例外はjava.lang.ClassCastExceptionです。java.lang.Classをjava.lang.reflect.ParameterizedTypeにキャストすることはできません

可変サービス

public class VariableService extends EntityService {
    public VariableService () {
        super.setEntityRepository(new VariableRepository());
    }
}

EntityService

public abstract class EntityService<T> {

    public EntityRepository<T> entityRepository;

    public T create(T entity) {
        return entityRepository.create(entity);
    }

    public T update(T entity) {
        return entityRepository.update(entity);
    }

    public void delete(T entity) {
        entityRepository.delete(entity);
    }

    public void setEntityRepository(EntityRepository<T> entityRepository) {
        this.entityRepository = entityRepository;
    }
}

可変リポジトリ

public class VariableRepository extends EntityRepository {

}

EntityRepository

@Repository
public abstract class EntityRepository<T> {

    //the equivalent of User.class
    protected Class<T> entityClass;

    @PersistenceContext(type= PersistenceContextType.TRANSACTION)
    public EntityManager entityManager;

    public EntityRepository () {
        //Get "T" and assign it to this.entityClass
        ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
        this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
    }

    /**
     * Create this entity
     * @param t
     * @return 
     */
    public T create(T t) {
        entityManager.persist(t);
        return t;
    }

    /**
     * Update this entity
     * @param t
     * @return 
     */
    public T update(T t) {
        return entityManager.merge(t);
    }

    /**
     * Delete this entity
     * @param entity 
     */
    public void delete(T t) {
        t = this.update(t);
        entityManager.remove(t);
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
}
4

4 に答える 4

18

ただ言っておくと、これはエンティティタイプを決定するためのかなり貧弱な設計です。クラス定義を推測するためにリフレクションに依存するのではなく、次のことを行う必要があります。エラーを取り除くだけでなく、全体的にクリーンで低レベルで、反射よりも高速です(実際に問題になるわけではありません)。

@Repository
public abstract class EntityRepository<T>{
    protected Class<T> entityClass;

    public EntityRepository(Class<T> entityClass){
        this.entityClass = entityClass;
    }

    //...
}


public class UserEntityRepository extends EntityRepository<User>{
    public UserEntityRepository(){
        super(User.class);
    }
}
于 2012-10-10T21:50:30.487 に答える
7

EntityRepositoryはParameterizedTypeタイプではありません。このクラスは、ParameterizedTypeのみを拡張します。これは、春がcglibによってクラスをプロキシした場合にも可能です。

クラスの保護者を確認する必要があります

public EntityRepository () {
    //Get "T" and assign it to this.entityClass
    Type genericSuperClass = getClass().getGenericSuperclass();

    ParameterizedType parametrizedType = null;
    while (parametrizedType == null) {
        if ((genericSuperClass instanceof ParameterizedType)) {
            parametrizedType = (ParameterizedType) genericSuperClass;
        } else {
            genericSuperClass = ((Class<?>) genericSuperClass).getGenericSuperclass();
        }
    }

    entityClass = (Class<T>) parametrizedType.getActualTypeArguments()[0];
}
于 2015-01-29T07:32:40.163 に答える
4

誤用しているようですParameterizedType。コンストラクターではEntityRepository、適切なチェックを行って、次のようなものを使用する必要があります。

public EntityRepository () {
    //Get "T" and assign it to this.entityClass
    ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
    Type type = genericSuperclass.getActualTypeArguments()[0];
    if (type instanceof Class) {
      this.entityClass = (Class<T>) type;
    } else if (type instanceof ParameterizedType) {
      this.entityClass = (Class<T>) ((ParameterizedType)type).getRawType();
    }
}

GenericArrayTypeただし、ネストされた値だけでなく値も処理する必要があるため、この実装は完全にはほど遠いものですParameterizedType

于 2012-05-14T20:18:27.243 に答える
1

問題を解決するには、@RepositoryアノテーションをクラスEntityRepositoryから削除する必要があります。

このスレッドを読む

java.lang.Classをjava.lang.reflect.ParameterizedTypeにキャストすることはできません

于 2017-03-19T14:49:34.210 に答える