org.springframework.data.mapping.PropertyReferenceException:没有找到类型的属性捕获 [英] org.springframework.data.mapping.PropertyReferenceException: No property catch found for type

查看:10
本文介绍了org.springframework.data.mapping.PropertyReferenceException:没有找到类型的属性捕获的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 Spring Data 存储库有疑问.

I have a issue with Spring Data repositories.

当我部署时,我得到一个异常,这是因为 Spring Data 尝试动态派生该方法,但在 Entity 中找不到相应的属性.

When I deploy, I get an exception and it's because Spring Data tries to derive dynamically the method, but can't find in the Entity the corresponding property.

如何将自定义方法放入自定义存储库中而不出现此问题?

How can I put a custom method in the Custom Repository without this issue?

这些是涉及的组件:

  1. LocaleJpaImpl:实体
  2. LocaleJpaRepositoryClient:业务层类
  3. 接口 LocaleJpaRepository 扩展 JpaRepository, LocaleJpaRepositoryCustom
  4. 接口 LocaleJpaRepositoryCustom
  5. LocaleJpaRepositoryImplemented 实现 LocaleJpaRepositoryCustom
  1. LocaleJpaImpl: the Entity
  2. LocaleJpaRepositoryClient: the business layer class
  3. interface LocaleJpaRepository extends JpaRepository<LocaleJpaImpl, Long>, LocaleJpaRepositoryCustom
  4. interface LocaleJpaRepositoryCustom
  5. LocaleJpaRepositoryImplemented implements LocaleJpaRepositoryCustom

LocaleJpaRepositoryCustom 有一个方法:

List<String> catchLanguagesCombinations() throws DAOSystemException;

(LanguagesCombinations 不是 LocaleJpaImpl 的属性.因为该动机在自定义存储库中).

(LanguagesCombinations isn't a property of LocaleJpaImpl. For that motive is in the 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

<小时>

这是相关代码:


This is the relevant code:

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.接口 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.接口 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";
    }
}

推荐答案

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

I had a issue like this and my mistake was the name of the custom repository class:

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

If the name of your jpa repository interface is LocaleJpaRepository, your new custom interface should be named LocaleJpaRepositoryCustom, but the class that makes the override in the method must be named LocaleJpaRepositoryImpl, as it follows:

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

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

Basically, the implementation class of your custom interface should start with the name of your repository interface (JPARepository) ending with 'Impl' keyword.

这篇关于org.springframework.data.mapping.PropertyReferenceException:没有找到类型的属性捕获的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆