さて、私はグーグルを検索し、多くの結果を見つけました、しかしそれらのどれも私の問題に答えることができませんでした。だから、ここに行きます。
Pinterest cloneを最小限に実装して、Spring MVCとSpring Data JPAを研究しようとしています。それで、以下は私が私の問題に関連していると思うコードの部分です。
モデル/エンティティ
@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...
}
サービス
@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
}
リポジトリ
public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {
}
findLatestBoards
でBoardService
メソッドを呼び出すと、return boardRepository.findAll(request).getContent();
行に "No Property Found"という例外がスローされます。これは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
例外
例外は "org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
"です。しかし、私が正しく理解したならば、プロパティboard
はPinItem
内に存在し、UserBoard
内のmappedBy = "board"
と正しくマッピングされています。
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)
私はなぜこの例外が投げられるのかわかりません。なぜそれが起こっているのですか?
注: Hibernateを永続化プロバイダとして使用しています。また、ここに置いたコード部分は、問題に関連していると私が思ったものです。そうでなければ、私に知らせてください、そして、私は必要な部分で質問を更新します。
私はこの同じ問題に遭遇し、ここで解決策を見つけました: http://Java.dzone.com/articles/persistence-layer-spring-data
エンティティプロパティの名前を変更しました。しかし、Springs Automatic Custom Queriesでは、古いプロパティ名に対して定義されたインターフェースがありました。
public interface IFooDAO extends JpaRepository< Foo, Long >{
Foo findByOldPropName( final String name );
}
エラーは、 "OldPropName"が見つからなくなり、例外をスローしたことを示しています。
DZoneの記事を引用するには:
Spring Dataは新しいRepository実装を作成するとき、インタフェースによって定義されたすべてのメソッドを分析し、メソッド名から自動的にクエリを生成しようとします。これには制限がありますが、新しいカスタムアクセス方法を非常に少ない労力で定義するための非常に強力でエレガントな方法です。たとえば、管理対象エンティティに名前フィールド(およびそのフィールドのJava Bean標準のgetterおよびsetter)がある場合は、DAOインタフェースでfindByNameメソッドを定義すると自動的に正しいクエリが生成されます。
public interface IFooDAO extends JpaRepository< Foo, Long >{
Foo findByName( final String name );
}
これは比較的単純な例です。クエリ作成メカニズムでは、さらに多くのキーワードセットがサポートされています。
パーサーがプロパティとドメインオブジェクトフィールドを一致させることができない場合は、次の例外がスローされます。
Java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo
あなたの名前は正しくありません。
documentation に従って、あなたのリポジトリがUserBoardRepository
name__の場合、あなたのカスタムリポジトリの実装はUserBoardRepositoryImpl
name__のような名前になるはずです。ここであなたはそれをBoardServiceImpl
name__と名付けました、それが例外を投げる理由です。
SpringのCrudRepository
を使用している間、findByの後にプロパティ名を正しく追加する必要があります。そうしないと例外が発生します「タイプにプロパティが見つかりません」
私はこの例外を受けていました。プロパティ名とメソッド名が同期していなかったためです。
私はDBアクセスに以下のコードを使用しました。
public interface UserDao extends CrudRepository<User, Long> {
User findByUsername(String username);
そして私のドメインユーザーはプロパティを持っています。
@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;
JPAリポジトリ名はserBoardRepositoryなので、カスタムインターフェイス名はserBoardRepositoryCustom(末尾が 'Custom')で、実装クラス名はserBoardRepositoryImpl)になります。(Implで終わらなければなりません。repository-impl-postfixプロパティを使って異なるpostfixで設定することができます。 )
このエラーは、存在しないプロパティにアクセスしようとした場合に発生します
私の推測では、ソートはproperty name
ではなくreal column name
によって行われます。エラーは、"UserBoard"
に"boardId"
という名前のプロパティがないことを示しています。
ベスト、
オーク
私の場合は、メソッド名にタイプミス(キャメルケース)があります。私はそれを "findbyLastName"と名付け、この例外に直面しました。私がそれを "findByLastName"に変更した後、例外はなくなりました。
ここに注意してください:Zane XYとAlan B. Deeからの答えはとても良いです。しかし、今Spring BootとSpring Dataを使用するであろうあなたの人々にとって、これはより現代的な答えになるでしょう。
次のようなクラスがあるとします。
@Entity
class MyClass {
@Id
@GeneratedValue
private Long id;
private String myClassName;
}
これに対するJpaRepository
は次のようになります。
interface MyClassRepository extends JpaRepository {
Collection<MyClass> findByMyClassName(String myClassName);
}
SpringがMyClass
プロパティmyClassName
にこのメソッドをマップするための何らかのメカニズムを持っている必要があるので、今すぐあなたの "カスタム" find by メソッドはCollection<MyClass> findByMyClassName(String myClassName)
とつづらなければなりません!
私は、これを考え出しました。なぜなら、 その名前でクラスを見つけるのは当然のことでした 意味的に、実際にはsynatxicallyyou myClassNameで探す
乾杯
同様の問題が発生したため、数時間頭痛がしました。
私のリポジトリの方法は次のとおりです。
public List<ResultClass> findAllByTypeAndObjects(String type, List<Object> objects);
タイプResultClassのプロパティタイプが見つからないというエラーが表示されました。
解決策は、jpa/hibernateが複数形をサポートしていないということでしたか?それでも、「s」を削除することで問題は解決しました。
public List<ResultClass> findAllByTypeAndObjects(String type, List<Object>
モデルまたはエンティティクラスでそのプロパティを定義しておく必要があります。
JPAでは、関係は単一の所有者を持ち、mappedBy
クラスでUserBoard
を使用することで、PinItem
がその双方向の関係の所有者であり、関係のPinItem
のプロパティはboard
であることがわかります。
UserBoard
クラスでは、board
という名前のフィールド/プロパティはありませんが、プロパティpinItemList
があるため、代わりにそのプロパティを使用してください。
このような使用ページを受け取るべきです
@Override
public Page<UserBoard> findLatestBoards() {
PageRequest request = new PageRequest(
0, PresentationUtil.PAGE_SIZE,
Sort.Direction.DESC, "boardId"
);
return boardRepository.findAll(request).getContent();
}
プロジェクトでSpring-Bootを使用している場合は、Application.Javaでこの注釈を追加してみてください。
@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
@SpringBootApplication
public class Application {.....