org.springframework.data.mapping.PropertyReferenceException:找不到类型的属性catch

时间:2013-12-26 00:01:26

标签: spring spring-data

我遇到Spring Data存储库的问题。

当我部署时,我得到一个异常,因为Spring Data试图动态地派生该方法,但却无法在Entity中找到相应的属性。

如何在没有此问题的情况下将自定义方法放在自定义存储库中?

这些是涉及的组成部分:

  1. LocaleJpaImpl:实体
  2. LocaleJpaRepositoryClient:业务层类
  3. interface LocaleJpaRepository extends JpaRepository<LocaleJpaImpl, Long>, LocaleJpaRepositoryCustom
  4. interface LocaleJpaRepositoryCustom
  5. LocaleJpaRepositoryImplemented implements LocaleJpaRepositoryCustom
  6. LocaleJpaRepositoryCustom有一个方法:

    List<String> catchLanguagesCombinations() throws DAOSystemException;
    

    (LanguagesCombinations不是LocaleJpaImpl的属性。因为该动机位于Custom Repository中。)

    此例外:

    Caused by: org.springframework.data.mapping.PropertyReferenceException: No property languages found for type com.engine.i18n.domain.LocaleJpaImpl
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:74)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:326)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:352)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:306)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:244)
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:73)
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:180)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:260)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:240)
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:68)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:57)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:90)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:280)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:148)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:125)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:41)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
    ... 33 more
    

    这是相关代码:

    1。 LocaleJpaImpl:

    import java.io.Serializable;
    import javax.persistence.AttributeOverride;
    import javax.persistence.Basic;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.Table;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import javax.xml.bind.annotation.XmlRootElement;
    import com.jpa.BaseEntityJpaSupport;
    
    @Entity
    @Table(name = "LOCALE")
    @XmlRootElement
    @AttributeOverride(name="id", column=@Column(name="LOCALE_ID"))
    
    @NamedQueries({
        @NamedQuery(name = "Locale.findAll", query = "FROM LocaleJpaImpl l"),
        @NamedQuery(name = "Locale.findByLocaleId", query = "FROM LocaleJpaImpl l WHERE l.localeId = :localeId"),
        @NamedQuery(name = "Locale.findByLanguageCode", query = "FROM LocaleJpaImpl l WHERE l.languageCode = :languageCode")
    
    public class LocaleJpaImpl extends BaseEntityJpaSupport implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
        //@Id
        //@Column(name = "LOCALE_ID")
        @Basic(optional = false)
        @NotNull
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer localeId;
    
        @Size(max = 2)
        @Column(name = "LANGUAGE_CODE")    
        private String languageCode;
    
        public LocaleJpaImpl(Integer localeId) { this.localeId = localeId; }    
        public int getLocaleId() { return localeId; }    
        public void setLocaleId(Integer localeId) { this.localeId = localeId; }      
        public String getLanguageCode() { return languageCode; }    
        public void setLanguageCode(String languageCode) { this.languageCode = languageCode; }
    }
    

    第3。 interface LocaleJpaRepository

    import java.util.List;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.query.Param;
    import com.engine.i18n.domain.LocaleJpaImpl;
    
    public interface LocaleJpaRepository extends JpaRepository<LocaleJpaImpl, Long>, LocaleJpaRepositoryCustom {
    
        @Query("FROM LocaleJpaImpl L WHERE L.languageCode = :languageCode")
        List<LocaleJpaImpl> findLocaleByLanguageCode(@Param("languageCode") String languageCode);   
    
    }
    

    4。 interface LocaleJpaRepositoryCustom

    import java.util.List;
    import com.util.DAOSystemException;
    
    public interface LocaleJpaRepositoryCustom {
    
        List<String> catchLanguagesCombinations() throws DAOSystemException;
    }
    

    5。 LocaleJpaRepositoryImplemented

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Locale;
    
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    
    import com.util.DAOSystemException;
    
    public class LocaleJpaRepositoryImplemented implements LocaleJpaRepositoryCustom {
    
        @PersistenceContext(unitName = "contentEntityManagerFactory")
        private EntityManager em;
    
        @SuppressWarnings("unchecked")
        @Override
        public List<String> catchLanguagesCombinations() throws DAOSystemException {
    
            return "result";
        }
    }
    

2 个答案:

答案 0 :(得分:82)

我遇到了这样的问题,我的错误是自定义存储库类的名称:

如果jpa存储库接口的名称为LocaleJpaRepository,则新的自定义接口应命名为LocaleJpaRepositoryCustom,但在方法中进行覆盖的类必须命名为LocaleJpaRepositoryImpl,如下:

public class LocalJpaRepositoryImpl implements LocalJpaRepositoryCustom{
@Override
   public void customMethod(){....}
}

基本上,自定义接口的实现类应该以以“Impl”关键字结尾的存储库接口(JPARepository)的名称开头。

答案 1 :(得分:0)

自定义存储库实现类名应该是使用Impl

扩展JPARepositry的接口名称