Bem, pesquisei no Google e encontrei muitos resultados, mas nenhum deles foi capaz de responder ao meu problema. Então, aqui vai.
Estou tentando estudar o Spring MVC e o Spring Data JPA fazendo uma implementação mínima do clone do pinterest. Então, a seguir estão as partes do código que eu acho relevantes para o meu problema.
Modelos / Entidades
@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...
}
Serviço
@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
}
Repositório
public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {
}
Agora, quando eu chamo o findLatestBoards
método BoardService
, a exceção "Nenhuma propriedade encontrada" é lançada na linha return boardRepository.findAll(request).getContent();
. Aqui está o trecho do log do 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
Exceção
A exceção é " org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
". Mas, se entendi corretamente, a propriedade board
está presente PinItem
e é mapeada corretamente com 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)
Não entendo por que essa exceção é lançada. Alguma idéia de por que isso está acontecendo?
Nota: Estou usando o Hibernate como provedor de persistência. Além disso, a parte do código que coloquei aqui é o que achei relevante para o problema. Caso contrário, informe-me e atualizarei a pergunta com a parte necessária.
fonte
Respostas:
Corri para o mesmo problema e encontrei a solução aqui: https://dzone.com/articles/persistence-layer-spring-data
Eu havia renomeado uma propriedade de entidade. Porém, com as consultas personalizadas automáticas do Springs, havia uma interface definida para o nome da propriedade antiga.
O erro indicava que não era mais possível encontrar "OldPropName" e lançou a exceção.
Para citar o artigo no DZone:
Quando o Spring Data cria uma nova implementação do Repositório, ele analisa todos os métodos definidos pelas interfaces e tenta gerar consultas automaticamente a partir do nome do método. Embora isso tenha limitações, é uma maneira muito poderosa e elegante de definir novos métodos de acesso personalizado com muito pouco esforço. Por exemplo, se a entidade gerenciada tiver um campo de nome (e o getter e setter padrão do Java Bean para esse campo), definir o método findByName na interface do DAO gerará automaticamente a consulta correta:
Este é um exemplo relativamente simples; um conjunto muito maior de palavras-chave é suportado pelo mecanismo de criação de consultas.
No caso em que o analisador não pode corresponder a propriedade ao campo de objeto do domínio, a seguinte exceção é lançada:
fonte
Sua nomeação não está correta .
De acordo com a documentação , se o seu repositório for
UserBoardRepository
, a implementação do seu repositório personalizado deve serUserBoardRepositoryImpl
nomeada como , aqui você nomeou comoBoardServiceImpl
, é por isso que lança a exceção.fonte
BoardServiceImpl
é apenas um serviço usando oUserBoardRepository
.Corrigido: ao usar o
CrudRepository
Spring, precisamos anexar o nome da propriedade corretamente depois de findBy, caso contrário, a exceção "Nenhuma propriedade encontrada para o tipo" será exibida.Eu estava recebendo essa exceção como. porque o nome da propriedade e o nome do método não estavam sincronizados.
Eu usei o código abaixo para o DB Access.
e meu usuário do domínio tem propriedade.
fonte
findStatusId
erradofindByStatusId
correta e por múltiplos verificação nomeação stackoverflow.com/a/32796493/944593Como o nome do repositório JPA é UserBoardRepository , seu nome de interface personalizado deve ser UserBoardRepositoryCustom (deve terminar com 'Custom') e o nome da classe de implementação deve ser UserBoardRepositoryImpl (deve terminar com Impl; você pode configurá-lo com um postfix diferente usando o repositório- propriedade impl-postfix )
fonte
esse erro ocorre se você tentar acessar a propriedade inexistente
meu palpite é que a classificação é feita na primavera
property name
e não na primaverareal column name
. e o erro indica que,"UserBoard"
não há propriedade nomeada"boardId"
.melhores
Carvalho
fonte
A
e uma classeB
que se estendeA
e tem uma propriedadex
. Ele estava reclamando que não poderia encontrar propriedadesx
na classeA
...No meu caso, tive um erro de digitação (caso camel) no nome do meu método. Eu o nomeei "findbyLastName" e enfrentei essa exceção. Depois que eu mudei para "findByLastName", a exceção desapareceu.
fonte
Observe aqui: as respostas de Zane XY e Alan B. Dee são bastante boas. No entanto, para aqueles de vocês que usariam o Spring Boot agora e o Spring Data, aqui está uma resposta mais moderna.
Suponha que você tenha uma classe como:
Agora um
JpaRepository
para isso seria semelhanteAgora, sua localização "personalizada" por método deve ser escrita
Collection<MyClass> findByMyClassName(String myClassName)
precisamente porque o Spring precisa ter algum mecanismo para mapear esse método naMyClass
propriedademyClassName
!Eu descobri isso porque, para mim, parecia natural encontrar uma classe por seu nome semântica , enquanto na verdade, sinaticamente , você encontra por myClassName
Felicidades
fonte
parece que o nome do método JpaRepository personalizado não corresponde a nenhuma variável nas classes de entidade. Verifique se o nome do método corresponde a uma variável na sua classe de entidade
por exemplo: você recebeu um nome de variável chamado "active" e seu método JpaRepository personalizado diz "findByActiveStatus" e, como não existe uma variável chamada "activeStatus", ele lançará "PropertyReferenceException"
fonte
Verifique o nome da propriedade na chamada padrão do repositório ei repository.findByUsername (nome de usuário)
fonte
Na JPA, um relacionamento tem um único proprietário e, ao usar
mappedBy
em suaUserBoard
classe, você diz quePinItem
é o proprietário desse relacionamento bidirecional e que a propriedade noPinItem
relacionamento é denominadaboard
.Na sua
UserBoard
classe, você não possui nenhum campo / propriedade com o nomeboard
, mas ele possui uma propriedadepinItemList
; portanto, você pode tentar usar essa propriedade.fonte
Se o seu projeto usou o Spring-Boot, você pode tentar adicionar essas anotações no seu Application.java.
fonte
você deve receber a página de uso , como esta
fonte
Você deve ter essa propriedade definida em seu modelo ou classe de entidade.
fonte
Eu tive um problema semelhante que me causou algumas horas de dor de cabeça.
Meu método de repositório foi:
Eu recebi o erro de que o tipo de propriedade não foi encontrado para o tipo ResultClass.
A solução foi que jpa / hibernate não suporta plurais? No entanto, remover os 's' resolveu o problema:
fonte
Recentemente, tive essa exceção ao passar para uma versão mais recente do boot por mola (de 1.5.4 a 1.5.20). O problema estava na estrutura do pacote do repositório.
Problema: No mesmo pacote estavam os pacotes: repository, repositoryCustom e repositoryImpl.
Solução: Reorganize os pacotes de repositório para que o pacote de repositório contenha o pacote repositoryCustom e o pacote repositoryCustom contenha repositoryImpl:
fonte
Outro cenário, que ainda não foi mencionado aqui, que causou esse erro é uma API que recebe
Pageable
(ouSort
) e a passa, como é, ao repositório JPA ao chamar a API do Swagger.O valor padrão do Swagger para o
Pageable
parâmetro é este:Observe o
"string"
que é uma propriedade que existe. A execução da API sem excluí-la ou alterá-la fará com queorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...
fonte