Spring данные jpa @Недействительное свойство не найденное исключение
Я новичок в spring -data-jpa, и в настоящее время я пытаюсь реализовать спящий режим. Я следил за учебником! для этого и в настоящее время сталкиваются с проблемами, начиная с самого приложения.
Во время запуска я получаю следующее исключение:
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property customer found for type com.adaptris.dashboard.customer.Customer
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:74)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:326)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:352)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:306)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:244)
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:73)
at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:180)
at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:260)
at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:240)
at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:71)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:57)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:90)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:280)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:148)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:125)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:41)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
Клиент - это мой класс домена, аннотированный с помощью
@Entity(name = "customer")
И я полагаю, он пытается подключиться к БД и получить таблицу клиентов, которую я на самом деле настроил. Вот мой spring -config:
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Activate Spring Data JPA repository support -->
<jpa:repositories base-package="com.adaptris.dashboard.customer" />
<!-- Declare a datasource that has pooling capabilities -->
<bean id="jpaDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" p:driverClass="${app.jdbc.driverClassName}"
p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}"
p:acquireIncrement="5" p:idleConnectionTestPeriod="60" p:maxPoolSize="100"
p:maxStatements="50" p:minPoolSize="10" />
<!-- Declare a JPA entityManagerFactory -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:persistenceXmlLocation="classpath*:META-INF/persistence.xml"
p:persistenceUnitName="hibernatePersistenceUnit" p:dataSource-ref="jpaDataSource"
p:jpaVendorAdapter-ref="hibernateVendor" />
<!-- Specify our ORM vendor -->
<bean id="hibernateVendor"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:showSql="false" />
<!-- Declare a transaction manager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory" />
И DB - это MYSQL, который работает. Ниже приведены свойства:
# database properties
app.jdbc.driverClassName=com.mysql.jdbc.Driver
app.jdbc.url=jdbc\:mysql\://Mallik-PC/adaptrisschema
app.jdbc.username=dbuser
app.jdbc.password=dbpassword
Пожалуйста, помогите мне выйти из этой проблемы.
Ответы
Ответ 1
Похоже, что интерфейс репозитория, который вы указали для вашего класса Domain, содержит метод findXXX
, тогда как XXX
не является свойством вашего класса Domain.
Пример:
public interface UserRepository extends CrudRepository<User, String> {
/**
* Finds a user by name.
*
* @param name The name of the User to find.
* @return The User with the given name.
*/
public User findByName(String name);
}
И ваш класс домена выглядит так и пропускает свойство "name":
@Entity
public class User {
private String firstname;
private String lastname;
// No "private String name" in here!
...
}
В вашем конкретном примере похоже, что вы добавили метод findByCustomer(Customer customer)
к вашему интерфейсу репозитория (вероятно, называемый чем-то вроде CustomerRepository
). Вам не нужен этот метод, поскольку метод findOne(<PrimaryKeyClass> id)
автоматически генерируется для вас с помощью Spring данных для JPA, и вы можете просто вызвать его с помощью @Id
вашего класса домена Customer
в качестве параметра.
Ответ 2
Spring ORM LocalContainerEntityManagerFactoryBean
(по состоянию на 3.1, я думаю) имеет свойство, называемое 'packagesToScan'. если у вас нет дополнительных свойств поставщика, которые вы хотите установить через persistence.xml, удалите p:persistenceXmlLocation
и замените на
p:packagesToScan="[package name where your entities are]"
это сообщает LocalContainerEntityManagerFactoryBean
, где можно найти все ваши @Entity
pojos и включает их в ваш EntityManagerFactory, поэтому Spring Data JPA может найти, где поставить "клиент"
Ответ 3
В моем случае я боролся с этой ошибкой из-за Spring чувствительности к регистру. Я искал сначала n ame, с объявлением в классе домена как первый N AME:
@Entity
public class User {
private String firstName;
...
Только потому, что метод find был объявлен как findByFirstname
, я получил эту ошибку. Он работает после изменения буквы n на N.
public Collection<User> findByFirstName(@Param("firstName") String firstname);