Hello,
I'm trying to update from Spring Boot 3.1.2 to 3.1.3. While the following code works in 3.1.2 (Test&Prod), it now fails with 3.1.3. I changed the Spring Boot version only.
It seems like Spring now analyses the Repository method, as if it was one of those defined without @Query annotation. But here we have the @Query annotation, so it shouldn't try to find the attributes from the method's name.
Repository:
package my.application.core.database.repository;
import static my.application.core.database.model.file.DealerWfsFileImportContent.DEALERS_COUNT_DEALERS_BY_WFS_FILE_IMPORT_CONTENT_ID;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
@Transactional
public interface WfsFileImportContentRepository extends JpaRepository<WfsFileImportContent, Long> {
@Query(name = DEALERS_COUNT_DEALERS_BY_WFS_FILE_IMPORT_CONTENT_ID, nativeQuery = true)
Long countDealersByWfsFileImportContentId(@Param("wfsFileImportContentId") long contentId);
}
Entity in question (yes, we're running SELECT statements against XML content):
package my.application.core.database.model.file;
import static my.application.core.database.model.file.DealerWfsFileImportContent.DEALERS_COUNT_DEALERS_BY_WFS_FILE_IMPORT_CONTENT_ID;
import jakarta.persistence.Column;
import jakarta.persistence.ColumnResult;
import jakarta.persistence.ConstructorResult;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.NamedNativeQuery;
import jakarta.persistence.SqlResultSetMapping;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Immutable;
/* NOTE: For these queries the order of the XML Columns, the SELECT values, the ColumnResult values and the final dto needs to be the same */
//@NamedNativeQuery(
// another @NamedNativeQuery defined here but not used
//)
@NamedNativeQuery(
name = DEALERS_COUNT_DEALERS_BY_WFS_FILE_IMPORT_CONTENT_ID,
query = "SELECT COUNT(dealer_id) "
+ " FROM wfs_file_import_content wfs, "
+ " XMLTABLE(XMLNAMESPACES('http://my.services/service' AS x),"
+ " '/x:pushGeofenceDataRequest/x:request/x:dealers/x:dealer'"
+ " PASSING request_body "
+ " COLUMNS "
+ " dealer_id TEXT PATH 'x:dealer_id' "
+ ") "
+ " where wfs.id = :wfsFileImportContentId"
)
@Immutable
@Entity
@Table(name = "wfs_file_import_content")
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class DealerWfsFileImportContent {
@Id
@Column(name = "id")
private Long fileImportContentId;
private String market;
private String dealerId;
private String name;
@Transient
public static final String DEALERS_COUNT_DEALERS_BY_WFS_FILE_IMPORT_CONTENT_ID = "count_dealers";
}
Exception when starting the application using Spring Boot 3.1.3:
16085 [main] ERROR o.s.boot.SpringApplication - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'wfsDataProcessor' defined in file [/home/stsc/IdeaProjects/My_Project/backend-interfaces/target/classes/my/application/core/processing/wfs/WfsDataProcessor.class]: Unsatisfied dependency expressed through constructor parameter 4: Error creating bean with name 'deltaCalculationService' defined in file [/home/stsc/IdeaProjects/My_Project/backend-business/target/classes/my/application/core/service/delta/DeltaCalculationService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'wfsFileService' defined in file [/home/stsc/IdeaProjects/My_Project/backend-business/target/classes/my/application/core/service/file/WfsFileService.class]: Unsatisfied dependency expressed through constructor parameter 2: Error creating bean with name 'wfsFileImportContentRepository' defined in my.application.core.database.repository.WfsFileImportContentRepository defined in @EnableJpaRepositories declared on Application: Could not create query for public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); Reason: Failed to create query for method public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); No property 'contentId' found for type 'WfsFileImport'; Traversed path: WfsFileImportContent.wfsFileImport
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:245)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1352)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1189)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:942)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)
at my.application.core.app.Application.main(Application.java:18)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'deltaCalculationService' defined in file [/home/stsc/IdeaProjects/My_Project/backend-business/target/classes/my/application/core/service/delta/DeltaCalculationService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'wfsFileService' defined in file [/home/stsc/IdeaProjects/My_Project/backend-business/target/classes/my/application/core/service/file/WfsFileService.class]: Unsatisfied dependency expressed through constructor parameter 2: Error creating bean with name 'wfsFileImportContentRepository' defined in my.application.core.database.repository.WfsFileImportContentRepository defined in @EnableJpaRepositories declared on Application: Could not create query for public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); Reason: Failed to create query for method public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); No property 'contentId' found for type 'WfsFileImport'; Traversed path: WfsFileImportContent.wfsFileImport
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:245)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1352)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1189)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:888)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
... 19 common frames omitted
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'wfsFileService' defined in file [/home/stsc/IdeaProjects/My_Project/backend-business/target/classes/my/application/core/service/file/WfsFileService.class]: Unsatisfied dependency expressed through constructor parameter 2: Error creating bean with name 'wfsFileImportContentRepository' defined in my.application.core.database.repository.WfsFileImportContentRepository defined in @EnableJpaRepositories declared on Application: Could not create query for public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); Reason: Failed to create query for method public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); No property 'contentId' found for type 'WfsFileImport'; Traversed path: WfsFileImportContent.wfsFileImport
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:245)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1352)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1189)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:888)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
... 33 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'wfsFileImportContentRepository' defined in my.application.core.database.repository.WfsFileImportContentRepository defined in @EnableJpaRepositories declared on Application: Could not create query for public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); Reason: Failed to create query for method public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); No property 'contentId' found for type 'WfsFileImport'; Traversed path: WfsFileImportContent.wfsFileImport
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:888)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
... 47 common frames omitted
Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); Reason: Failed to create query for method public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); No property 'contentId' found for type 'WfsFileImport'; Traversed path: WfsFileImportContent.wfsFileImport
at org.springframework.data.repository.query.QueryCreationException.create(QueryCreationException.java:101)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:115)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.mapMethodsToQuery(QueryExecutorMethodInterceptor.java:99)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lambda$new$0(QueryExecutorMethodInterceptor.java:88)
at java.base/java.util.Optional.map(Optional.java:260)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.<init>(QueryExecutorMethodInterceptor.java:88)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:357)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:279)
at org.springframework.data.util.Lazy.getNullable(Lazy.java:245)
at org.springframework.data.util.Lazy.get(Lazy.java:114)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:285)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:132)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1817)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1766)
... 58 common frames omitted
Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract java.lang.Long my.application.core.database.repository.WfsFileImportContentRepository.countDealersByWfsFileImportContentId(long); No property 'contentId' found for type 'WfsFileImport'; Traversed path: WfsFileImportContent.wfsFileImport
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:107)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:124)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:258)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:95)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:111)
... 70 common frames omitted
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property 'contentId' found for type 'WfsFileImport'; Traversed path: WfsFileImportContent.wfsFileImport
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:90)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:405)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:381)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:415)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:438)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:438)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:381)
at org.springframework.data.mapping.PropertyPath.lambda$from$0(PropertyPath.java:334)
at java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:330)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:316)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:299)
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:81)
at org.springframework.data.repository.query.parser.PartTree$OrPart.lambda$new$0(PartTree.java:242)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:243)
at org.springframework.data.repository.query.parser.PartTree$Predicate.lambda$new$0(PartTree.java:372)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:373)
at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:96)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:100)
... 74 common frames omitted
Process finished with exit code 1
Thanks a lot for your help - and do not hesitate to contact me, if you need anything for your analysis.
Stefan
Comment From: quaff
You should report it to https://github.com/spring-projects/spring-data-jpa/issues with a minimal reproducer.
Comment From: stefan-schilling
You should report it to https://github.com/spring-projects/spring-data-jpa/issues with a minimal reproducer.
Alright, created https://github.com/spring-projects/spring-data-jpa/issues/3129 - thanks.