2013-10-25 17 views
57

Bene, ho cercato su Google e ho trovato molti risultati, ma nessuno di loro è stato in grado di rispondere al mio problema. Quindi, ecco qui.Spring Data JPA - Eccezione "Nessuna proprietà trovata per tipo"

Sto provando a studiare Spring MVC e Spring Data JPA eseguendo un'implementazione minima del clone pinterest. Quindi, di seguito sono riportate le parti di codice che ritengo 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 
} 

Repository

public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> { 

} 

Ora, quando chiamo il 012 Metodoin BoardService, l'eccezione "Nessuna proprietà trovata" viene generata 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 [[email protected]] 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.springframewo[email protected]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 [[email protected]] 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 [[email protected]] 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 [[email protected]] 
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 [[email protected]] 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 correttamente, la proprietà board è presente in PinItem ed è mappata correttamente 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é questa eccezione è generata. Qualche idea sul perché sta succedendo?

Nota: Sto utilizzando Hibernate come provider di Persistenza. Inoltre, la porzione di codice che ho messo qui è ciò che pensavo fosse rilevante per il problema. Se non lo è, fammelo sapere e aggiornerò la domanda con la parte richiesta.

+0

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

risposta

0

In APP un rapporto ha un unico proprietario, e utilizzando mappedBy nella classe UserBoard dici che PinItem è il proprietario di quella relazione bidirezionale, e che la proprietà in PinItem del rapporto si chiama board.

Nella tua classe UserBoard non hai campi/proprietà con il nome board, ma ha una proprietà pinItemList, quindi potresti provare a utilizzare quella proprietà.

9

questo errore si verifica se si tenta l'accesso non-esiste proprietà

mia ipotesi è che l'ordinamento è fatto da molla property name e non per real column name. e l'errore indica che, in "UserBoard" non è presente alcuna proprietà denominata "boardId".

bests,

Oak

69

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

avevo rinominato una proprietà entità. Ma con Spring Query personalizzate automatiche 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 poteva più trovare "OldPropName" e ha gettato l'eccezione.

Per citare l'articolo su DZone:

Quando Primavera dati crea una nuova implementazione repository, analizza tutti i metodi definiti dalle interfacce e cerca di generare automaticamente le query dal nome del metodo. Mentre questo ha dei limiti, è un modo molto potente ed elegante per definire nuovi metodi di accesso personalizzati con pochissimo sforzo. Per esempio, se l'entità gestito ha un campo del nome (e il getter standard di Java Bean e setter per il campo), che definisce il 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; una serie molto più ampia di parole chiave è supportata dal meccanismo di creazione delle query.

Nel caso in cui il parser non può corrispondere alla proprietà con il campo oggetto di dominio, la seguente eccezione viene generata:

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

Penso che questa sia la risposta più dettagliata e chiara, quindi dovrebbe essere accettata. – kmarabet

49

tua denominazione non è corretto.

Come per la documentation, se il repository è UserBoardRepository, l'attuazione del repository personalizzato dovrebbe essere il nome come UserBoardRepositoryImpl, qui hai nominato come BoardServiceImpl, è per questo che genera l'eccezione.

+0

inoltre, tutte le classi/interfacce del repository devono essere collocate in una directory, per quanto ne so –

1

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

12

Dal momento che il JPA nome repository è UserBoardRepository, il tuo nome interfaccia personalizzata dovrebbe essere UserBoardRepositoryCustom (dovrebbe finire con 'su misura') e l'implementazione nome della classe dovrebbe essere UserBoardRepositoryImpl (dovrebbe terminare con Impl; è possibile set con un suffisso diverso utilizzando il repository-impl-suffisso proprietà)

21

fisso, mentre utilizzando CrudRepository di Spring, dobbiamo aggiungere il propertyname correttamente dopo findBy altrimenti darà y ou exception "Nessuna proprietà trovata per tipo"

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

Ho usato sotto il codice per DB Access.

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

e il mio Dominio Utente 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; 
+0

Questo approccio mi ha aiutato: ho usato il nome errato di una proprietà della mia classe nel metodo predefinito (fornito da CrudRepository interface) del repository (es. instea di findByDateOfStatisticsBetween() Ho usato findByDateBetween() denominazione del metodo) – ryzhman

0

Se il progetto usato Primavera-Boot, si può provare ad aggiungere questo annotazioni a vostra Application.java.

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class) 
@SpringBootApplication 

public class Application {..... 
0

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

Supponiamo di avere una classe come ad esempio:

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

    private String myClassName; 
} 

Ora un JpaRepository per questo sarebbe simile

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

Ora la vostra "custom" trovare da metodo deve farro Collection<MyClass> findByMyClassName(String myClassName) proprio perché Primavera ha bisogno di avere qualche meccanismo per mappare questo metodo sulla proprietà MyClassmyClassName!

ho capito questo perché, per me, è sembrato naturale trovare una classe con il suo nomesemanticamente, mentre in realtà, synatxically si trovare da myClassName

Acclamazioni

Problemi correlati