Spring Data JPA - Wyjątek „Brak właściwości dla typu”


127

Cóż, przeszukałem Google i znalazłem wiele wyników, ale żaden z nich nie był w stanie odpowiedzieć na mój problem. Tak więc, oto jest.

Próbuję przestudiować Spring MVC i Spring Data JPA, wykonując minimalną implementację klonu pinterest. Tak więc poniżej znajdują się części kodu, które moim zdaniem są istotne dla mojego problemu.

Modele / jednostki

@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...
}

Usługa

@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
}

Magazyn

public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {

}

Teraz, gdy wywołuję findLatestBoardsmetodę w BoardService, w wierszu jest zgłaszany wyjątek „Nie znaleziono właściwości” return boardRepository.findAll(request).getContent();. Oto fragment dziennika Tomcat.

LOG DEBUG

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

Wyjątek

Wyjątkiem jest „ org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard”. Ale, jeśli dobrze zrozumiałem, właściwość boardjest obecna PinItemi poprawnie odwzorowana za pomocą 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)

Nie rozumiem, dlaczego zgłoszony został ten wyjątek. Masz jakiś pomysł, dlaczego to się dzieje?

Uwaga: używam Hibernate jako dostawcę trwałości. Również część kodu, którą tutaj umieściłem, jest tym, co uważałem za istotne dla problemu. Jeśli tak nie jest, daj mi znać, a zaktualizuję pytanie o wymaganą część.


2
Napotkałem ten sam problem, gdy nazwałem osadzony identyfikator jako MyCompositePK i próbowałem napisać findByMyCompositePKUserId (Long userId) . Chodzi o to, że musi to być również przypadek wielbłąda dla repozytorium CRUD, aby rozróżnić właściwości tabeli podczas tworzenia zapytania z metody. Musi to być więc MyCompositePk i findByMyCompositePkUserId (długi
identyfikator użytkownika

Odpowiedzi:


140

Natknąłem się na ten sam problem i znalazłem rozwiązanie tutaj: https://dzone.com/articles/persistence-layer-spring-data

Zmieniłem nazwę właściwości encji. Jednak w przypadku automatycznych niestandardowych zapytań firmy Springs istniał interfejs zdefiniowany dla starej nazwy właściwości.

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

Błąd wskazywał, że nie mógł już znaleźć „OldPropName” i zwrócił wyjątek.

Cytując artykuł o DZone:

Kiedy Spring Data tworzy nową implementację repozytorium, analizuje wszystkie metody zdefiniowane przez interfejsy i próbuje automatycznie generować zapytania na podstawie nazwy metody. Chociaż ma to ograniczenia, jest to bardzo skuteczny i elegancki sposób definiowania nowych niestandardowych metod dostępu przy niewielkim wysiłku. Na przykład, jeśli zarządzana encja ma pole nazwy (i standard pobierający i ustawiający w Java Bean dla tego pola), zdefiniowanie metody findByName w interfejsie DAO automatycznie wygeneruje poprawne zapytanie:

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

To jest stosunkowo prosty przykład; znacznie większy zestaw słów kluczowych jest obsługiwany przez mechanizm tworzenia zapytań.

W przypadku, gdy parser nie może dopasować właściwości do pola obiektu domeny, zgłaszany jest następujący wyjątek:

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

87

Twoje nazewnictwo jest nieprawidłowe .

Zgodnie z dokumentacją , jeśli twoje repozytorium jest UserBoardRepository, implementacja twojego niestandardowego repozytorium powinna mieć nazwę, tak jak UserBoardRepositoryImpltutaj nazwałeś je jako BoardServiceImpl, dlatego zgłasza wyjątek.


1
dodatkowo wszystkie klasy / interfejsy repozytorium powinny być umieszczone w jednym katalogu - o ile wiem
Błażej Kocik

6
Nie wiem, dlaczego tak bardzo głosowano za tym głosem, ale nie ma niestandardowego repozytorium zaangażowanego w to pytanie. BoardServiceImplto tylko usługa korzystająca z UserBoardRepository.
Didier L

to moja sprawa! Nie miałem problemu, zanim przeniosłem klasy Impl w zupełnie innym pakiecie, ale potem tak się stało. Dziękuję
Buckstabue

To uratowało mi dzień!
letimome

48

Naprawiono, podczas korzystania CrudRepositoryze Springa musimy poprawnie dodać nazwę właściwości po findBy w przeciwnym razie spowoduje to wyjątek „Nie znaleziono właściwości dla typu”

Dostałem ten wyjątek jako. ponieważ nazwa właściwości i nazwa metody nie były zsynchronizowane.

Użyłem poniższego kodu dla DB Access.

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

a mój użytkownik domeny ma właściwość.

@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
Takie podejście pomogło mi - użyłem nieprawidłowej nazwy właściwości mojej klasy w metodzie `` default '' repozytorium (dostarczonej przez interfejs CrudRepository) (tj.Instea z findByDateOfStatisticsBetween () Użyłem nazewnictwa metody findByDateBetween ())
ryzhman

1
przykład findStatusIdźle findByStatusIdpoprawny i dla wielu nazw sprawdź stackoverflow.com/a/32796493/944593
shareef

Zaoszczędziło mi mnóstwo czasu. Dziękuję Ci :).
Joey587

27

Ponieważ JPA nazwa repozytorium jest UserBoardRepository , niestandardowe Nazwa interfejsu powinny być UserBoardRepositoryCustom (powinien kończyć się na „Niestandardowy”) oraz implementacji nazwy klasy powinny być UserBoardRepositoryImpl (powinna kończyć IMPL, można ustawić go z innym Postfix pomocą repository- impl-postfix, właściwość)


17

ten błąd występuje, jeśli spróbujesz uzyskać dostęp do nieistniejącej właściwości

przypuszczam, że sortowanie odbywa się wiosną, property namea nie do końca real column name. a błąd wskazuje, że w programie "UserBoard"nie ma nazwanej właściwości "boardId".

bests,

Dąb


Dziękuję Ci. Znalezienie tego rozwiązania zajęło mi trochę czasu, bo Spring narzekała na coś zupełnie innego. Mam klasę Ai klasę, Bktóra się rozszerza Ai ma właściwość x. Narzekał, że nie może znaleźć nieruchomości xw klasie A...
GuiRitter

9

W moim przypadku miałem literówkę (sprawa wielbłąda) w mojej nazwie metody. Nazwałem go „findbyLastName” i stanąłem przed tym wyjątkiem. Po zmianie na „findByLastName” wyjątek zniknął.


1
Uwaga dla siebie: sprawdź dwukrotnie! :-)
lilalinux

8

Uwaga: odpowiedzi Zane'a XY i Alana B. Dee są całkiem dobre. Jednak dla tych z Was, którzy teraz używaliby Spring Boot i Spring Data, oto odpowiedź, która byłaby bardziej nowoczesna.

Załóżmy, że masz taką klasę jak:

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

    private String myClassName;
}

Teraz JpaRepositorywyglądałoby to jak

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

Teraz twoje „niestandardowe” wyszukiwanie według metody musi być zapisane Collection<MyClass> findByMyClassName(String myClassName)dokładnie, ponieważ Spring musi mieć jakiś mechanizm mapowania tej metody na MyClasswłaściwośćmyClassName !

Rozgryzłem to, ponieważ wydaje mi się naturalne znalezienie klasy o nazwie semantycznie , podczas gdy w rzeczywistości synatxically ci odnaleźć przez myClassName

Twoje zdrowie


2

wygląda na to, że nazwa Twojej niestandardowej metody JpaRepository nie pasuje do żadnej zmiennej w klasach encji. Upewnij się, że nazwa metody pasuje do zmiennej w klasie encji

na przykład: masz nazwę zmiennej o nazwie „active”, a Twoja niestandardowa metoda JpaRepository mówi „findByActiveStatus”, a ponieważ nie ma zmiennej o nazwie „activeStatus”, zgłosi ona „PropertyReferenceException”



0

W JPA relacja ma jednego właściciela, a używając mappedByw swojej UserBoardklasie, możesz powiedzieć, że PinItemjest właścicielem tej dwukierunkowej relacji i że właściwość w PinItemrelacji jest nazwana board.

W swojej UserBoardklasie nie masz żadnych pól / właściwości z nazwą board, ale ma ona właściwość pinItemList, więc możesz spróbować użyć tej właściwości zamiast niej.


0

Jeśli Twój projekt wykorzystywał Spring-Boot, możesz spróbować dodać te adnotacje w swoim Application.java.

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
@SpringBootApplication

public class Application {.....

0

powinieneś otrzymać stronę użytkowania , taką jak ta

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

0

Powinieneś mieć tę właściwość zdefiniowaną w modelu lub klasie jednostki.


0

Miałem podobny problem, który spowodował kilka godzin bólu głowy.

Moja metoda repozytorium to:

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

Otrzymałem błąd, że typ właściwości nie został znaleziony dla typu ResultClass.

Rozwiązaniem było to, że jpa / hibernate nie obsługuje liczby mnogiej? Niemniej jednak usunięcie „s” rozwiązało problem:

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

Przepraszam, co usunąłeś? Te dwie linie wyglądają tak samo
Raymond Chen

@ user7344209 Poprawiłem ten błąd. Zobacz nazwę metody drugiego przykładu kodu.
mirisbowring

Nawet dla obiektów nazw obiektów?
P Satish Patro

0

Miałem ten wyjątek niedawno, kiedy przechodziłem na nowszą wersję Spring-Boot (z 1.5.4 do 1.5.20). Problem dotyczył struktury pakietu repozytorium.

Problem: W ramach tego samego pakietu znajdowały się pakiety: repository, repositoryCustom i repositoryImpl.

Rozwiązanie: Zmień rozmieszczenie pakietów repozytorium tak, aby pakiet repozytorium zawierał repozytorium Pakiet niestandardowy i repozytorium Pakiet niestandardowy zawiera repozytorium Impl:

magazyn 
   |
   ----- repositoryCustom
             |
             ----- repositoryImpl

0

Innym scenariuszem, o którym jeszcze nie wspomniano, który spowodował ten błąd, jest API, które odbiera Pageable(lub Sort) i przekazuje je w takiej postaci, w jakiej jest, do repozytorium JPA podczas wywoływania API z Swagger.

Domyślna wartość Swagger Pageableparametru jest następująca:

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

Zwróć uwagę na "string"istniejącą właściwość. Uruchomienie API bez jego usunięcia lub zmiany spowodujeorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.