Spring Data JPA - Eccezione "Nessuna proprietà trovata per il tipo"


127

Bene, ho cercato su Google e ho trovato molti risultati, ma nessuno di loro è stato in grado di rispondere al mio problema. Quindi, eccolo qui.

Sto cercando di studiare Spring MVC e Spring Data JPA eseguendo un'implementazione minima di pinterest clone. Quindi, di seguito sono riportate le parti di codice che penso siano rilevanti per il mio problema.

Modelli / Enti

@Entity
@Table(name = "pin_item")
public class PinItem implements Serializable {
    // properties ...
    @JoinColumn(name = "board_id", referencedColumnName = "user_board_id")
    @ManyToOne(optional = false)
    private UserBoard board;

    // getters and setters...
}

@Entity
@Table(name = "user_board")
public class UserBoard implements Serializable {
    // properties ...
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "board")
    private List<PinItem> pinItemList;

    // getters and setters...
}

Servizio

@Service
@Transactional(readOnly = true)
public class BoardServiceImpl implements BoardService {
    @Autowired
    private UserBoardRepository boardRepository;

    @Override
    public List<UserBoard> findLatestBoards() {
        PageRequest request = new PageRequest(
                     0, PresentationUtil.PAGE_SIZE, 
                     Sort.Direction.DESC, "boardId"
        );
        return boardRepository.findAll(request).getContent();
    }

    // Other Methods
}

deposito

public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {

}

Ora, quando chiamo il findLatestBoardsmetodo in BoardService, viene generata l'eccezione "Nessuna proprietà trovata" sulla riga return boardRepository.findAll(request).getContent();. Ecco l'estratto dal registro di Tomcat.

DEBUG LOG

12:28:44,254 DEBUG AnnotationTransactionAttributeSource:106 - Adding transactional method 'findLatestBoards' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
12:28:44,254 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'transactionManager'
12:28:44,254 DEBUG JpaTransactionManager:366 - Creating new transaction with name [com.tecnooc.picpin.service.impl.BoardServiceImpl.findLatestBoards]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
12:28:44,254 DEBUG JpaTransactionManager:369 - Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] for JPA transaction
12:28:44,255 DEBUG AbstractTransactionImpl:158 - begin
12:28:44,255 DEBUG LogicalConnectionImpl:212 - Obtaining JDBC connection
12:28:44,255 DEBUG DriverManagerDataSource:162 - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/pic_pin]
12:28:44,266 DEBUG LogicalConnectionImpl:218 - Obtained JDBC connection
12:28:44,267 DEBUG JdbcTransaction:69 - initial autocommit status: true
12:28:44,267 DEBUG JdbcTransaction:71 - disabling autocommit
12:28:44,267 DEBUG JpaTransactionManager:401 - Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@370da60e]
12:28:44,274 DEBUG TransactionalRepositoryProxyPostProcessor$CustomAnnotationTransactionAttributeSource:286 - Adding transactional method 'findAll' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
12:28:44,274 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'transactionManager'
12:28:44,274 DEBUG JpaTransactionManager:332 - Found thread-bound EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] for JPA transaction
12:28:44,274 DEBUG JpaTransactionManager:471 - Participating in existing transaction
12:28:44,279 DEBUG CachedIntrospectionResults:159 - Not strongly caching class [java.io.Serializable] because it is not cache-safe
12:28:44,281 DEBUG JpaTransactionManager:851 - Participating transaction failed - marking existing transaction as rollback-only
12:28:44,281 DEBUG JpaTransactionManager:559 - Setting JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] rollback-only
12:28:44,283 DEBUG JpaTransactionManager:844 - Initiating transaction rollback
12:28:44,284 DEBUG JpaTransactionManager:534 - Rolling back JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194]
12:28:44,284 DEBUG AbstractTransactionImpl:203 - rolling back
12:28:44,284 DEBUG JdbcTransaction:164 - rolled JDBC Connection
12:28:44,285 DEBUG JdbcTransaction:126 - re-enabling autocommit
12:28:44,285 DEBUG JpaTransactionManager:594 - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] after transaction
12:28:44,285 DEBUG EntityManagerFactoryUtils:338 - Closing JPA EntityManager
12:28:44,286 DEBUG LogicalConnectionImpl:232 - Releasing JDBC connection
12:28:44,286 DEBUG LogicalConnectionImpl:250 - Released JDBC connection
12:28:44,287 DEBUG ExceptionHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
12:28:44,289 DEBUG ResponseStatusExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
12:28:44,290 DEBUG DefaultHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
12:28:44,291 DEBUG DispatcherServlet:959 - Could not complete request

Eccezione

L'eccezione è " org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard". Ma, se ho capito bene, la proprietà boardè presente in PinItemed è correttamente mappata con mappedBy = "board"in UserBoard.

org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:353)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:271)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:245)
    at org.springframework.data.jpa.repository.query.QueryUtils.toJpaOrder(QueryUtils.java:408)
    at org.springframework.data.jpa.repository.query.QueryUtils.toOrders(QueryUtils.java:372)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:456)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:437)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:319)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:289)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:333)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:318)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at com.sun.proxy.$Proxy147.findAll(Unknown Source)
    at com.tecnooc.picpin.service.impl.BoardServiceImpl.findLatestBoards(BoardServiceImpl.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at com.sun.proxy.$Proxy148.findLatestBoards(Unknown Source)
    at com.tecnooc.picpin.controller.BoardController.latest(BoardController.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

Non capisco perché viene generata questa eccezione. Qualche idea sul perché sta succedendo?

Nota: sto usando Hibernate come provider di persistenza. Inoltre, la parte di codice che ho inserito qui è ciò che pensavo fosse rilevante per il problema. Se non lo è, fammelo sapere e aggiornerò la domanda con la parte richiesta.


2
Mi sono imbattuto nello stesso problema quando ho chiamato un ID incorporato come MyCompositePK e ho provato a scrivere findByMyCompositePKUserId (Long userId) . Il punto è che deve essere anche il caso del cammello per il repository CRUD, in modo da distinguere tra le proprietà della tabella quando si crea la query dal proprio metodo. Quindi, deve essere MyCompositePk e findByMyCompositePkUserId (Long userId)
EmeraldTablet

Risposte:


138

Mi sono imbattuto in questo stesso problema e ho trovato la soluzione qui: https://dzone.com/articles/persistence-layer-spring-data

Avevo rinominato una proprietà dell'entità. Ma con le query personalizzate automatiche di Springs c'era un'interfaccia definita per il vecchio nome della proprietà.

public interface IFooDAO extends JpaRepository< Foo, Long >{
     Foo findByOldPropName( final String name );
}

L'errore indicava che non riusciva più a trovare "OldPropName" e generava l'eccezione.

Per citare l'articolo su DZone:

Quando Spring Data crea una nuova implementazione del repository, analizza tutti i metodi definiti dalle interfacce e cerca di generare automaticamente query dal nome del metodo. Sebbene abbia dei limiti, è un modo molto potente ed elegante per definire nuovi metodi di accesso personalizzati con uno sforzo minimo. Ad esempio, se l'entità gestita ha un campo nome (e il getter e setter standard Java Bean per quel campo), la definizione del metodo findByName nell'interfaccia DAO genererà automaticamente la query corretta:

public interface IFooDAO extends JpaRepository< Foo, Long >{
     Foo findByName( final String name );
}

Questo è un esempio relativamente semplice; un insieme molto più ampio di parole chiave è supportato dal meccanismo di creazione delle query.

Nel caso in cui il parser non possa abbinare la proprietà con il campo dell'oggetto del dominio, viene generata la seguente eccezione:

java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo

86

La tua denominazione non è corretta .

Secondo la documentazione , se il tuo repository è UserBoardRepository, l'implementazione del tuo repository personalizzato dovrebbe essere denominata come UserBoardRepositoryImpl, qui l'hai chiamata BoardServiceImpl, ecco perché lancia l'eccezione.


1
inoltre, tutte le classi / interfacce del repository dovrebbero essere collocate in una directory - per quanto ne so
Błażej Kocik

6
Non so perché questo sia votato così tanto, ma non ci sono repository personalizzati coinvolti in questa domanda. BoardServiceImplè solo un servizio che utilizza l'estensione UserBoardRepository.
Didier L

questo è il mio caso! Non ho avuto problemi prima di spostare le classi Impl in un pacchetto completamente diverso, ma dopo è successo. Grazie
Buckstabue

Questo mi ha salvato la giornata!
letimome

48

Risolto, durante l'utilizzo CrudRepositorydi Spring, dobbiamo aggiungere correttamente il nome della proprietà dopo findBy altrimenti ti darà l'eccezione "Nessuna proprietà trovata per il tipo"

Ho ricevuto questa eccezione come. perché il nome della proprietà e il nome del metodo non erano sincronizzati.

Ho usato il codice seguente per DB Access.

public interface UserDao extends CrudRepository<User, Long> {
    User findByUsername(String username);

e il mio utente di dominio ha proprietà.

@Entity
public class User implements UserDetails {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "userId", nullable = false, updatable = false)
    private Long userId;
    private String username;

1
Questo approccio mi ha aiutato: ho usato il nome errato di una proprietà della mia classe nel metodo `` predefinito '' del repository (fornito dall'interfaccia CrudRepository) (ieinstea di findByDateOfStatisticsBetween () Ho usato la denominazione del metodo findByDateBetween ())
ryzhman

1
esempio findStatusIdsbagliato findByStatusIdcorretto e per più di controllo di denominazione stackoverflow.com/a/32796493/944593
Shareef

Mi ha risparmiato un sacco di tempo. Grazie :).
Joey587

27

Poiché il nome del repository JPA è UserBoardRepository , il nome dell'interfaccia personalizzata dovrebbe essere UserBoardRepositoryCustom (dovrebbe terminare con "Custom") e il nome della classe di implementazione dovrebbe essere UserBoardRepositoryImpl (dovrebbe terminare con Impl; puoi impostarlo con un suffisso diverso utilizzando il repository- proprietà impl-postfix )


17

questo errore si verifica se si tenta di accedere a una proprietà inesistente

la mia ipotesi è che l'ordinamento sia fatto entro la primavera property namee non entro real column name. e l'errore indica che "UserBoard"non è presente alcuna proprietà denominata "boardId".

bests,

Quercia


Grazie. Mi ci è voluto un po 'per trovare questa soluzione perché Spring si lamentava di qualcosa di completamente diverso. Ho una classe Ae una classe Bche si estende Ae ho una proprietà x. Si lamentava di non riuscire a trovare una proprietà xin classe A...
GuiRitter

9

Nel mio caso ho avuto un errore di battitura (caso cammello) nel nome del mio metodo. L'ho chiamato "findbyLastName" e ho affrontato questa eccezione. Dopo averlo cambiato in "findByLastName", l'eccezione era sparita.


1
Nota per me: ricontrolla! :-)
lilalinux

8

Nota qui: le risposte di Zane XY e Alan B. Dee sono abbastanza buone. Tuttavia, per quelli di voi che utilizzerebbero Spring Boot ora e Spring Data, ecco quella che sarebbe una risposta più moderna.

Supponi di avere una classe come:

@Entity
class MyClass {
    @Id
    @GeneratedValue
    private Long id;

    private String myClassName;
}

Ora un JpaRepositoryper questo sarebbe simile

interface MyClassRepository extends JpaRepository {
    Collection<MyClass> findByMyClassName(String myClassName);
}

Ora la tua ricerca "personalizzata" per metodo deve essere scritta Collection<MyClass> findByMyClassName(String myClassName)precisamente perché Spring ha bisogno di un meccanismo per mappare questo metodo sulla MyClassproprietà myClassName!

L'ho capito perché, a me, è sembrato naturale trovare semanticamente una classe in base al suo nome , mentre in realtà, in modo sintattico , la si trova in myClassName

Saluti


2

sembra che il nome del metodo JpaRepository personalizzato non corrisponda ad alcuna variabile nelle classi di entità. Assicurati che il nome del tuo metodo corrisponda a una variabile nella tua classe di entità

ad esempio: hai un nome di variabile chiamato "active" e il tuo metodo JpaRepository personalizzato dice "findByActiveStatus" e poiché non esiste una variabile chiamata "activeStatus", lancerà "PropertyReferenceException"


1

Controllare il nome della proprietà nella chiamata predefinita del repository ei repository .indByUsername (nome utente)


0

In JPA una relazione ha un unico proprietario e, utilizzando mappedBynella tua UserBoardclasse, dici che PinItemè il proprietario di quella relazione bidirezionale e che la proprietà nella PinItemrelazione è denominataboard .

Nella tua UserBoardclasse non hai alcun campo / proprietà con il nome board, ma ha una proprietà pinItemList, quindi potresti provare a usare quella proprietà.


0

Se il tuo progetto utilizzava Spring-Boot, puoi provare ad aggiungere queste annotazioni al tuo Application.java.

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
@SpringBootApplication

public class Application {.....

0

dovresti ricevere la pagina di utilizzo , come questa

 @Override
public Page<UserBoard> findLatestBoards() {
    PageRequest request = new PageRequest(
                 0, PresentationUtil.PAGE_SIZE, 
                 Sort.Direction.DESC, "boardId"
    );
    return boardRepository.findAll(request).getContent();
}

0

Dovresti avere quella proprietà definita nel tuo modello o classe di entità.


0

Ho avuto un problema simile che mi ha causato alcune ore di mal di testa.

Il mio metodo di repository era:

public List<ResultClass> findAllByTypeAndObjects(String type, List<Object> objects);

Ho ricevuto l'errore che il tipo di proprietà non è stato trovato per il tipo ResultClass.

La soluzione era che jpa / hibernate non supporta i plurali? Tuttavia, la rimozione della 's' ha risolto il problema:

public List<ResultClass> findAllByTypeAndObject(String type, List<Object>

Scusa, cosa hai rimosso? Queste due righe sembrano uguali
Raymond Chen

@ user7344209 Ho corretto questo errore. Vedere il nome del metodo del secondo esempio di codice.
mirisbowring

Anche per oggetti con nome di entità?
P Satish Patro

0

Ho avuto questa eccezione di recente quando sono passato a una versione più recente con avvio a molla (da 1.5.4 a 1.5.20). Il problema era nella struttura del pacchetto del repository.

Problema: nello stesso pacchetto c'erano i pacchetti: repository, repositoryCustom e repositoryImpl.

Soluzione: riorganizza i pacchetti del repository in modo che il pacchetto del repository contenga il repository Pacchetto personalizzato e repository Il pacchetto personalizzato contiene il repositoryImpl:

deposito 
   |
   ----- repositoryCustom
             |
             ----- repositoryImpl

0

Un altro scenario, che non è stato ancora menzionato qui, che ha causato questo errore è un'API che riceve Pageable(o Sort) e la passa, così com'è, al repository JPA quando si chiama l'API da Swagger.

Il valore predefinito di Swagger per il Pageableparametro è questo:

  {
    "page": 0,
    "size": 0,
    "sort": [
      "string"
    ]
  }

Notare il "string"là che è una proprietà che esiste. L'esecuzione dell'API senza eliminarla o modificarla causeràorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.