Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

spring - org.springframework.data.mapping.PropertyReferenceException: No property catch found for type

I have a issue with Spring Data repositories.

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?

These are the involved components:

  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 has a method:

List<String> catchLanguagesCombinations() throws DAOSystemException;

(LanguagesCombinations isn't a property of LocaleJpaImpl. For that motive is in the Custom Repository).

This exception:

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. 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";
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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(){....}
}

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...