Spring Data Rest doesn't rollback after Access Denied Exception - spring-boot

I have an application built with Spring Data Rest, when saving an entity using an unauthorized account through preAuthorize, the system throws the Access Denied exception, however the registration is performed. Analyzing the log below it is possible to see a jpaTransaction performing a flush and updating the entity before the exception. Can anyone tell me how to avoid saving in this case or how I can perform a rollback?
... com.mysql.cj.jdbc.result.ResultSetImpl#2393ebf8]
2022-10-19 13:20:11.320 TRACE 705721 --- [nio-8080-exec-6] o.h.r.j.i.ResourceRegistryStandardImpl : Closing prepared statement [HikariProxyPreparedStatement#91893682 wrapping com.mysql.cj.jdbc.ClientPreparedStatement: select chain0_.category_id as category1_3_0_, c... where chain0_.category_id=13122]
2022-10-19 13:20:11.321 TRACE 705721 --- [nio-8080-exec-6] o.h.e.j.i.JdbcCoordinatorImpl : Starting after statement execution processing [ON_CLOSE]
2022-10-19 13:20:11.321 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.StatefulPersistenceContext : Initializing non-lazy collections
2022-10-19 13:20:11.321 DEBUG 705721 --- [nio-8080-exec-6] stractLoadPlanBasedCollectionInitializer : Done loading collection
2022-10-19 13:20:11.321 TRACE 705721 --- [nio-8080-exec-6] DefaultInitializeCollectionEventListener : Collection initialized
2022-10-19 13:20:13.373 DEBUG 705721 --- [SchedulerThread] o.q.c.QuartzSchedulerThread : batch acquisition of 0 triggers
2022-10-19 13:20:13.423 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : com.springboot.api.entities.Category.name is dirty
2022-10-19 13:20:13.423 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : com.springboot.api.entities.Category.updateDate is dirty
2022-10-19 13:20:13.423 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.DefaultFlushEntityEventListener : Found dirty properties [[com.springboot.api.entities.Category#13122]] : [name, updateDate]
2022-10-19 13:20:13.423 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.Versioning : Incrementing: 76 to 77
2022-10-19 13:20:13.424 DEBUG 705721 --- [nio-8080-exec-6] o.h.e.i.Collections : Collection found: [com.springboot.api.entities.Category.chain#13122], was: [com.springboot.api.entities.Category.chain#13122] (initialized)
2022-10-19 13:20:13.424 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Processing unreferenced collections
2022-10-19 13:20:13.425 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Scheduling collection removes/(re)creates/updates
2022-10-19 13:20:13.425 DEBUG 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Flushed: 0 insertions, 1 updates, 0 deletions to 2 objects
2022-10-19 13:20:13.425 DEBUG 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Flushed: 0 (re)creations, 0 updates, 0 removals to 1 collections
2022-10-19 13:20:13.425 DEBUG 705721 --- [nio-8080-exec-6] o.h.i.u.EntityPrinter : Listing entities:
2022-10-19 13:20:13.425 DEBUG 705721 --- [nio-8080-exec-6] o.h.i.u.EntityPrinter : com.springboot.api.entities.Category{chain=[], updateDate=2022-10-19T13:20:08.095108, typeCategoryResultReports=NOT_APPLIED, businessAccount=com.springboot.api.entities.BusinessAccount#13119, description=Conta somatória de vendas dos produtos e serviços., typeResultReports=NOT_APPLIED_TO_DRE, typeCategory=INCOME, version=77, ordder=1, deleted=false, name=RECEITAS DE VENDAS 789, parentCategory=null, id=13122, createDate=2022-07-25T11:06:40, enumerated=1}
2022-10-19 13:20:13.426 DEBUG 705721 --- [nio-8080-exec-6] o.h.i.u.EntityPrinter : com.springboot.api.entities.BusinessAccount{updateDate=2022-07-25T11:07:46, active=true, contactPerson=Erik, version=1, legalName=Erick e Tatiane Restaurante Ltda, deleted=false, blocked=false, phone=1138234204, name=ERIT Restaurante Ltda, tin=02669055000114, id=13119, businessAccountParent=null, email=timlerirde#vusra.com, createDate=2022-07-25T11:06:36}
2022-10-19 13:20:13.426 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.DefaultAutoFlushEventListener : Don't need to execute flush
2022-10-19 13:20:13.426 TRACE 705721 --- [nio-8080-exec-6] o.h.e.q.s.HQLQueryPlan : Find: select b from BusinessAccount b where b.deleted = false and b.id = :id
2022-10-19 13:20:13.426 TRACE 705721 --- [nio-8080-exec-6] o.h.e.s.QueryParameters : Named parameters: {id=13119}
2022-10-19 13:20:13.426 DEBUG 705721 --- [nio-8080-exec-6] o.h.SQL : select businessac0_.id as id1_1_, ... where businessac0_.deleted=0 and businessac0_.id=?
2022-10-19 13:20:13.427 TRACE 705721 --- [nio-8080-exec-6] o.h.r.j.i.ResourceRegistryStandardImpl : Registering statement [HikariProxyPreparedStatement#1827444228 wrapping com.mysql.cj.jdbc.ClientPreparedStatement: select businessac0_.id as id1_1_, businessac0_.active as active2_1_, ... businessac0_.id=** NOT SPECIFIED **]
2022-10-19 13:20:13.427 TRACE 705721 --- [nio-8080-exec-6] o.h.e.j.i.JdbcCoordinatorImpl : Registering last query statement [HikariProxyPreparedStatement#1827444228 wrapping com.mysql.cj.jdbc.ClientPreparedStatement: select businessac0_.id as id1_1_, businessac0_.active as active2_1_, ... businessac0_.version as version13_1_ from business_account businessac0_ where businessac0_.deleted=0 and businessac0_.id=** NOT SPECIFIED **]
2022-10-19 13:20:13.428 TRACE 705721 --- [nio-8080-exec-6] o.h.t.d.s.BasicBinder : binding parameter [1] as [BIGINT] - [13119]
2022-10-19 13:20:13.428 TRACE 705721 --- [nio-8080-exec-6] o.h.l.Loader : Bound [2] parameters total
2022-10-19 13:20:13.583 TRACE 705721 --- [nio-8080-exec-6] o.h.r.j.i.ResourceRegistryStandardImpl : Registering result set [HikariProxyResultSet#212627179 wrapping com.mysql.cj.jdbc.result.ResultSetImpl#305c88ad]
2022-10-19 13:20:13.584 TRACE 705721 --- [nio-8080-exec-6] o.h.l.Loader : Processing result set
2022-10-19 13:20:13.584 DEBUG 705721 --- [nio-8080-exec-6] o.h.l.Loader : Result set row: 0
2022-10-19 13:20:13.584 TRACE 705721 --- [nio-8080-exec-6] o.h.t.d.s.BasicExtractor : extracted value ([id1_1_] : [BIGINT]) - [13119]
2022-10-19 13:20:13.585 DEBUG 705721 --- [nio-8080-exec-6] o.h.l.Loader : Result row: EntityKey[com.springboot.api.entities.BusinessAccount#13119]
2022-10-19 13:20:13.585 TRACE 705721 --- [nio-8080-exec-6] o.h.l.Loader : Done processing result set (1 rows)
2022-10-19 13:20:13.585 TRACE 705721 --- [nio-8080-exec-6] o.h.l.Loader : Total objects hydrated: 0
2022-10-19 13:20:13.586 TRACE 705721 --- [nio-8080-exec-6] o.h.r.j.i.ResourceRegistryStandardImpl : Releasing statement [HikariProxyPreparedStatement#1827444228 wrapping com.mysql.cj.jdbc.ClientPreparedStatement: select businessac0_.id as id1_1_, businessac0_.active as active2_1_, businessac0_.blocked as blocked3_1_, businessac0_.business_account_parent_id as busines14_1_, businessac0_.contact_person as contact_4_1_, businessac0_.create_date as create_d5_1_, businessac0_.deleted as deleted6_1_, businessac0_.email as email7_1_, businessac0_.legal_name as legal_na8_1_, businessac0_.name as name9_1_, businessac0_.phone as phone10_1_, businessac0_.tin as tin11_1_, businessac0_.update_date as update_12_1_, businessac0_.version as version13_1_ from business_account businessac0_ where businessac0_.deleted=0 and businessac0_.id=13119]
2022-10-19 13:20:13.586 TRACE 705721 --- [nio-8080-exec-6] o.h.r.j.i.ResourceRegistryStandardImpl : Closing result set [HikariProxyResultSet#212627179 wrapping com.mysql.cj.jdbc.result.ResultSetImpl#305c88ad]
2022-10-19 13:20:13.586 TRACE 705721 --- [nio-8080-exec-6] o.h.r.j.i.ResourceRegistryStandardImpl : Closing prepared statement [HikariProxyPreparedStatement#1827444228 wrapping com.mysql.cj.jdbc.ClientPreparedStatement: select businessac0_.id as id1_1_, businessac0_.active as active2_1_, businessac0_.blocked as blocked3_1_, businessac0_.business_account_parent_id as busines14_1_, businessac0_.contact_person as contact_4_1_, businessac0_.create_date as create_d5_1_, businessac0_.deleted as deleted6_1_, businessac0_.email as email7_1_, businessac0_.legal_name as legal_na8_1_, businessac0_.name as name9_1_, businessac0_.phone as phone10_1_, businessac0_.tin as tin11_1_, businessac0_.update_date as update_12_1_, businessac0_.version as version13_1_ from business_account businessac0_ where businessac0_.deleted=0 and businessac0_.id=13119]
2022-10-19 13:20:13.586 TRACE 705721 --- [nio-8080-exec-6] o.h.e.j.i.JdbcCoordinatorImpl : Starting after statement execution processing [ON_CLOSE]
2022-10-19 13:20:13.586 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.StatefulPersistenceContext : Initializing non-lazy collections
2022-10-19 13:20:13.589 TRACE 705721 --- [nio-8080-exec-6] o.s.t.i.TransactionInterceptor : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findById]
2022-10-19 13:20:13.589 TRACE 705721 --- [nio-8080-exec-6] o.s.o.j.JpaTransactionManager : Triggering beforeCommit synchronization
2022-10-19 13:20:13.589 TRACE 705721 --- [nio-8080-exec-6] o.s.o.j.JpaTransactionManager : Triggering beforeCompletion synchronization
2022-10-19 13:20:13.589 DEBUG 705721 --- [nio-8080-exec-6] o.s.o.j.JpaTransactionManager : Initiating transaction commit
2022-10-19 13:20:13.589 DEBUG 705721 --- [nio-8080-exec-6] o.s.o.j.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(329218779PersistenceContext[entityKeys=[EntityKey[com.springboot.api.entities.Category#13122], EntityKey[com.springboot.api.entities.BusinessAccount#13119]], collectionKeys=[CollectionKey[com.springboot.api.entities.Category.chain#13122]]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])]
2022-10-19 13:20:13.589 DEBUG 705721 --- [nio-8080-exec-6] o.h.e.t.i.TransactionImpl : committing
2022-10-19 13:20:13.590 TRACE 705721 --- [nio-8080-exec-6] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#beforeCompletionCallback
2022-10-19 13:20:13.590 TRACE 705721 --- [nio-8080-exec-6] o.h.i.SessionImpl : SessionImpl#beforeTransactionCompletion()
2022-10-19 13:20:13.590 TRACE 705721 --- [nio-8080-exec-6] o.h.i.SessionImpl : Automatically flushing session
2022-10-19 13:20:13.590 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Flushing session
2022-10-19 13:20:13.590 DEBUG 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Processing flush-time cascades
2022-10-19 13:20:13.590 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.Cascade : Processing cascade ACTION_PERSIST_ON_FLUSH for: com.springboot.api.entities.Category
2022-10-19 13:20:13.590 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.Cascade : Done processing cascade ACTION_PERSIST_ON_FLUSH for: com.springboot.api.entities.Category
2022-10-19 13:20:13.591 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.Cascade : Processing cascade ACTION_PERSIST_ON_FLUSH for: com.springboot.api.entities.BusinessAccount
2022-10-19 13:20:13.592 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.Cascade : Done processing cascade ACTION_PERSIST_ON_FLUSH for: com.springboot.api.entities.BusinessAccount
2022-10-19 13:20:13.592 DEBUG 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Dirty checking collections
2022-10-19 13:20:13.592 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Flushing entities and processing referenced collections
2022-10-19 13:20:13.593 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : com.springboot.api.entities.Category.name is dirty
2022-10-19 13:20:13.593 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : com.springboot.api.entities.Category.updateDate is dirty
2022-10-19 13:20:13.593 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : com.springboot.api.entities.Category.version is dirty
2022-10-19 13:20:13.593 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.DefaultFlushEntityEventListener : Found dirty properties [[com.springboot.api.entities.Category#13122]] : [name, updateDate, version]
2022-10-19 13:20:13.593 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.DefaultFlushEntityEventListener : Updating entity: [com.springboot.api.entities.Category#13122]
2022-10-19 13:20:16.443 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : com.springboot.api.entities.Category.name is dirty
2022-10-19 13:20:16.444 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : com.springboot.api.entities.Category.updateDate is dirty
2022-10-19 13:20:16.444 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : com.springboot.api.entities.Category.version is dirty
2022-10-19 13:20:16.444 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.DefaultFlushEntityEventListener : Found dirty properties [[com.springboot.api.entities.Category#13122]] : [name, updateDate, version]
2022-10-19 13:20:16.444 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.Versioning : Incrementing: 76 to 77
2022-10-19 13:20:16.445 DEBUG 705721 --- [nio-8080-exec-6] o.h.e.i.Collections : Collection found: [com.springboot.api.entities.Category.chain#13122], was: [com.springboot.api.entities.Category.chain#13122] (initialized)
2022-10-19 13:20:16.445 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Processing unreferenced collections
2022-10-19 13:20:16.445 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Scheduling collection removes/(re)creates/updates
2022-10-19 13:20:16.445 DEBUG 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Flushed: 0 insertions, 1 updates, 0 deletions to 2 objects
2022-10-19 13:20:16.445 DEBUG 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Flushed: 0 (re)creations, 0 updates, 0 removals to 1 collections
2022-10-19 13:20:16.445 DEBUG 705721 --- [nio-8080-exec-6] o.h.i.u.EntityPrinter : Listing entities:
2022-10-19 13:20:16.446 DEBUG 705721 --- [nio-8080-exec-6] o.h.i.u.EntityPrinter : com.springboot.api.entities.Category{chain=[], updateDate=2022-10-19T13:20:13.593846, typeCategoryResultReports=NOT_APPLIED, businessAccount=com.springboot.api.entities.BusinessAccount#13119, description=Conta somatória de vendas dos produtos e serviços., typeResultReports=NOT_APPLIED_TO_DRE, typeCategory=INCOME, version=77, ordder=1, deleted=false, name=RECEITAS DE VENDAS 789, ...
2022-10-19 13:20:16.446 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Executing flush
2022-10-19 13:20:16.447 TRACE 705721 --- [nio-8080-exec-6] o.h.v.i.e.c.SimpleConstraintTree : Validating value RECEITAS DE VENDAS 789 against constraint defined by ConstraintDescriptorImpl{annotation=j.v.c.NotEmpty, payloads=[], hasComposingConstraints=true, isReportAsSingleInvalidConstraint=false, elementType=FIELD, definedOn=DEFINED_LOCALLY, groups=[interface javax.validation.groups.Default], attributes={groups=[Ljava.lang.Class;#7375d1f6, message={name.required}, payload=[Ljava.lang.Class;#261e67fb}, constraintType=GENERIC, valueUnwrapping=DEFAULT}.
2022-10-19 13:20:16.454 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : Updating entity: [com.springboot.api.entities.Category#13122]
2022-10-19 13:20:16.454 TRACE 705721 --- [nio-8080-exec-6] o.h.p.e.AbstractEntityPersister : Existing version: 76 -> New version:77
2022-10-19 13:20:16.454 DEBUG 705721 --- [nio-8080-exec-6] o.h.SQL : update category set business_account_id=?, create_date=?, deleted=?, description=?, enumerated=?, name=?, ordder=?, parent_category_id=?, type_category=?, type_category_result_reports=?, type_result_reports=?, update_date=?, version=? where id=? and version=?
...
2022-10-19 13:20:16.461 TRACE 705721 --- [nio-8080-exec-6] o.h.t.d.s.BasicBinder : binding parameter [15] as [INTEGER] - [76]
2022-10-19 13:20:16.627 TRACE 705721 --- [nio-8080-exec-6] o.h.r.j.i.ResourceRegistryStandardImpl : Releasing statement [HikariProxyPreparedStatement#1680526329 wrapping com.mysql.cj.jdbc.ClientPreparedStatement: update category set business_account_id=13119, create_date='2022-07-25 11:06:40.0', deleted=0, description='Conta somatória de vendas dos produtos e serviços.', enumerated='1', name='RECEITAS DE VENDAS 789', ordder='1', parent_category_id=null, type_category='INCOME', type_category_result_reports='NOT_APPLIED', type_result_reports='NOT_APPLIED_TO_DRE', update_date='2022-10-19 13:20:13.593846', version=77 where id=13122 and version=76]
2022-10-19 13:20:16.628 TRACE 705721 --- [nio-8080-exec-6] o.h.r.j.i.ResourceRegistryStandardImpl : Closing prepared statement [HikariProxyPreparedStatement#1680526329 wrapping com.mysql.cj.jdbc.ClientPreparedStatement: update category set business_account_id=13119, create_date='2022-07-25 11:06:40.0', deleted=0, description='Conta somatória de vendas dos produtos e serviços.', enumerated='1', name='RECEITAS DE VENDAS 789', ordder='1', parent_category_id=null, type_category='INCOME', type_category_result_reports='NOT_APPLIED', type_result_reports='NOT_APPLIED_TO_DRE', update_date='2022-10-19 13:20:13.593846', version=77 where id=13122 and version=76]
2022-10-19 13:20:16.628 TRACE 705721 --- [nio-8080-exec-6] o.h.e.j.i.JdbcCoordinatorImpl : Starting after statement execution processing [ON_CLOSE]
2022-10-19 13:20:16.629 TRACE 705721 --- [nio-8080-exec-6] o.h.e.j.i.JdbcCoordinatorImpl : Starting after statement execution processing [ON_CLOSE]
2022-10-19 13:20:16.629 TRACE 705721 --- [nio-8080-exec-6] o.h.e.i.AbstractFlushingEventListener : Post flush
2022-10-19 13:20:16.629 TRACE 705721 --- [nio-8080-exec-6] .t.i.SynchronizationRegistryStandardImpl : SynchronizationRegistryStandardImpl.notifySynchronizationsBeforeTransactionCompletion
2022-10-19 13:20:16.629 TRACE 705721 --- [nio-8080-exec-6] j.i.AbstractLogicalConnectionImplementor : Preparing to commit transaction via JDBC Connection.commit()
2022-10-19 13:20:16.786 TRACE 705721 --- [nio-8080-exec-6] j.i.AbstractLogicalConnectionImplementor : Transaction committed via JDBC Connection.commit()
2022-10-19 13:20:16.787 TRACE 705721 --- [nio-8080-exec-6] j.i.AbstractLogicalConnectionImplementor : re-enabling auto-commit on JDBC Connection after completion of JDBC-based transaction
2022-10-19 13:20:16.940 TRACE 705721 --- [nio-8080-exec-6] j.i.AbstractLogicalConnectionImplementor : LogicalConnection#afterTransaction
2022-10-19 13:20:16.940 TRACE 705721 --- [nio-8080-exec-6] o.h.r.j.i.ResourceRegistryStandardImpl : Releasing JDBC resources
2022-10-19 13:20:16.941 TRACE 705721 --- [nio-8080-exec-6] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#afterCompletionCallback(true)
2022-10-19 13:20:16.941 TRACE 705721 --- [nio-8080-exec-6] .t.i.SynchronizationRegistryStandardImpl : SynchronizationRegistryStandardImpl.notifySynchronizationsAfterTransactionCompletion(3)
2022-10-19 13:20:16.941 TRACE 705721 --- [nio-8080-exec-6] o.h.i.SessionImpl : SessionImpl#afterTransactionCompletion(successful=true, delayed=false)
2022-10-19 13:20:16.941 TRACE 705721 --- [nio-8080-exec-6] o.s.o.j.JpaTransactionManager : Triggering afterCommit synchronization
2022-10-19 13:20:16.941 TRACE 705721 --- [nio-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Clearing transaction synchronization
2022-10-19 13:20:16.941 TRACE 705721 --- [nio-8080-exec-6] o.s.o.j.JpaTransactionManager : Triggering afterCompletion synchronization
2022-10-19 13:20:16.941 TRACE 705721 --- [nio-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.jdbc.datasource.ConnectionHolder#710d834f] for key [HikariDataSource (HikariPool-10)] from thread [http-nio-8080-exec-6]
2022-10-19 13:20:16.942 DEBUG 705721 --- [nio-8080-exec-6] o.s.o.j.JpaTransactionManager : Not closing pre-bound JPA EntityManager after transaction
2022-10-19 13:20:16.952 TRACE 705721 --- [nio-8080-exec-6] .w.s.m.m.a.ServletInvocableHandlerMethod : Arguments: [org.springframework.data.rest.webmvc.RootResourceInformation#6e5097f2, Resource { content: Category(id=13122, name=RECEITAS DE VENDAS 789, description=Conta somatória de vendas dos produtos e serviços., parentCategory=null, chain=null, typeCategory=INCOME, typeResultReports=NOT_APPLIED_TO_DRE, ordder=1, typeCategoryResultReports=NOT_APPLIED, businessAccount=BusinessAccount(id=13119, name=ERIT Restaurante Ltda, legalName=Erick e Tatiane Restaurante Ltda, tin=02669055000114, email=timlerirde#vusra.com, phone=1138234204, contactPerson=Erik, businessAccountParent=null, active=true, blocked=false, deleted=false, createDate=2022-07-25T11:06:36, updateDate=2022-07-25T11:07:46, version=1), deleted=false, createDate=2022-07-25T11:06:40, updateDate=2022-10-19T13:20:13.593846, version=76, enumerated=1, unselectable=false), links: [] }, 13122, org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler#299ef425, null, application/json;charset=UTF-8]
...
2022-10-19 13:20:16.959 TRACE 705721 --- [nio-8080-exec-6] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'persistentEntities'
2022-10-19 13:20:16.960 TRACE 705721 --- [nio-8080-exec-6] .PrePostAnnotationSecurityMetadataSource : Looking for Pre/Post annotations for method 'save' on target class 'class com.sun.proxy.$Proxy552'
2022-10-19 13:20:16.961 DEBUG 705721 --- [nio-8080-exec-6] .PrePostAnnotationSecurityMetadataSource : #org.springframework.security.access.prepost.PreAuthorize(value=hasAuthority('ROLE_ADMIN') or (#category.businessAccount.id == principal.businessAccountId && hasAuthority('MODULE_FINANCE_AND_ACCOUNTING_WRITE'))) found on specific method: public final com.springboot.api.entities.Category com.sun.proxy.$Proxy552.save(com.springboot.api.entities.Category)
2022-10-19 13:20:16.961 DEBUG 705721 --- [nio-8080-exec-6] m.DelegatingMethodSecurityMetadataSource : Caching method [CacheKey[com.sun.proxy.$Proxy552; public abstract com.springboot.api.entities.Category com.springboot.api.repositories.CategoryRepository.save(com.springboot.api.entities.Category)]] with attributes [[authorize: 'hasAuthority('ROLE_ADMIN') or (#category.businessAccount.id == principal.businessAccountId && hasAuthority('MODULE_FINANCE_AND_ACCOUNTING_WRITE'))', filter: 'null', filterTarget: 'null']]
2022-10-19 13:20:16.972 TRACE 705721 --- [nio-8080-exec-6] .PrePostAnnotationSecurityMetadataSource : Looking for Pre/Post annotations for method 'save' on target class 'class org.springframework.data.jpa.repository.support.SimpleJpaRepository'
2022-10-19 13:20:16.974 DEBUG 705721 --- [nio-8080-exec-6] .PrePostAnnotationSecurityMetadataSource : #org.springframework.security.access.prepost.PreAuthorize(value=hasAuthority('ROLE_ADMIN') or (#category.businessAccount.id == principal.businessAccountId && hasAuthority('MODULE_FINANCE_AND_ACCOUNTING_WRITE'))) found on specific method: public abstract com.springboot.api.entities.Category com.springboot.api.repositories.CategoryRepository.save(com.springboot.api.entities.Category)
...
2022-10-19 13:20:16.975 DEBUG 705721 --- [nio-8080-exec-6] o.s.s.a.i.a.MethodSecurityInterceptor : Previously Authenticated: org.springframework.security.authentication.UsernamePasswordAuthenticationToken#5ebb3b09: Principal: com.springboot.api.security.JwtUser#37c7e936; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails#b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_OPERATOR, MODULE_ACCOUNTS_MANAGEMENT_READ, MODULE_USERS_MANAGEMENT_READ, MODULE_HUMAN_RESOURCE_READ, MODULE_SALES_AND_MARKETING_READ, MODULE_PURCHASE_READ, MODULE_FINANCE_AND_ACCOUNTING_READ, MODULE_CUSTOMERS_RELATIONSHIP_MANAGEMENT_READ
2022-10-19 13:20:16.992 DEBUG 705721 --- [nio-8080-exec-6] o.s.s.a.v.AffirmativeBased : Voter: org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter#261e06ac, returned: -1
2022-10-19 13:20:16.992 DEBUG 705721 --- [nio-8080-exec-6] o.s.s.a.v.AffirmativeBased : Voter: org.springframework.security.access.annotation.Jsr250Voter#2b59105d, returned: 0
2022-10-19 13:20:16.992 DEBUG 705721 --- [nio-8080-exec-6] o.s.s.a.v.AffirmativeBased : Voter: org.springframework.security.access.vote.RoleVoter#ef6ea6b, returned: 0
2022-10-19 13:20:16.992 DEBUG 705721 --- [nio-8080-exec-6] o.s.s.a.v.AffirmativeBased : Voter: org.springframework.security.access.vote.AuthenticatedVoter#1e3b3303, returned: 0
2022-10-19 13:20:17.025 TRACE 705721 --- [nio-8080-exec-6] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'delegatingApplicationListener'
2022-10-19 13:20:17.025 TRACE 705721 --- [nio-8080-exec-6] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'springApplicationAdminRegistrar'
2022-10-19 13:20:17.025 TRACE 705721 --- [nio-8080-exec-6] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'liveReloadServerEventListener'
2022-10-19 13:20:17.036 DEBUG 705721 --- [nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Using #ExceptionHandler com.springboot.api.controllers.ExceptionHandlerController#handleAccessDeniedException(AccessDeniedException, WebRequest)
2022-10-19 13:20:17.036 TRACE 705721 --- [nio-8080-exec-6] .w.s.m.m.a.ServletInvocableHandlerMethod : Arguments: [org.springframework.security.access.AccessDeniedException: Access is denied, ServletWebRequest: uri=/categories/13122;client=0:0:0:0:0:0:0:1;user=jo#eriti.com.br]
2022-10-19 13:20:17.037 ERROR 705721 --- [nio-8080-exec-6] c.s.a.c.ExceptionHandlerController : Access is denied
org.springframework.security.access.AccessDeniedException: Access is denied
at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:84) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:233) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:65) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
Here is my Repository
#PreAuthorize("hasAuthority('ROLE_ADMIN')")
#Transactional(readOnly=true)
#RepositoryRestResource(collectionResourceRel = "categories", path = "categories")
public interface CategoryRepository extends PagingAndSortingRepository<Category, Long> {
#Transactional(readOnly=false)
#PreAuthorize("hasAuthority('ROLE_ADMIN') or (#category.businessAccount.id == principal.businessAccountId && "
+ "hasAuthority('MODULE_FINANCE_AND_ACCOUNTING_WRITE'))")
#Override
<S extends Category> S save(#Param("category") S file);
...
}
Here is my EventHandler
#Component
#RepositoryEventHandler(Category.class)
public class CategoryEventHandler {
#Autowired
private CategoryRepository categoryRepository;
#Autowired
private MessageSource messageSource;
#HandleBeforeCreate
public void handleEntityAccountBeforeCreate(Category category) throws Exception {
...
}
...
}
Here is my Security Config
...
#Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.cors()
.and()
.csrf()
.disable()
.exceptionHandling()
.authenticationEntryPoint(unauthorizedHandler)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers(AUTH_WHITELIST).permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated();
httpSecurity.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
httpSecurity.headers().cacheControl();
}
...

Related

Unable to fetch the view file

On making a GET Request which returns a ModelAndView Object I am getting the following error
: GET "/tweet2?email=tim#gmail.com", parameters={masked} 2022-03-08
11:04:45.459 DEBUG 46576 --- [nio-8080-exec-3]
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to
com.example.demo.RestAPIExample#getTweetsByEmail(String) 2022-03-08
11:04:45.464 DEBUG 46576 --- [nio-8080-exec-3]
o.s.w.s.v.ContentNegotiatingViewResolver : Selected '/' given [/]
2022-03-08 11:04:45.464 DEBUG 46576 --- [nio-8080-exec-3]
o.s.w.servlet.view.InternalResourceView : View name 'tweets', model
{tweets=[com.example.demo.Tweet#3a7a85cb]} 2022-03-08 11:04:45.465
DEBUG 46576 --- [nio-8080-exec-3]
o.s.w.servlet.view.InternalResourceView : Forwarding to [tweets]
2022-03-08 11:04:45.467 DEBUG 46576 --- [nio-8080-exec-3]
o.s.web.servlet.DispatcherServlet : "FORWARD" dispatch for GET
"/tweets?email=tim#gmail.com", parameters={masked} 2022-03-08
11:04:45.470 DEBUG 46576 --- [nio-8080-exec-3]
o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to
ResourceHttpRequestHandler [classpath [META-INF/resources/], classpath
[resources/], classpath [static/], classpath [public/], ServletContext
[/]] 2022-03-08 11:04:45.472 DEBUG 46576 --- [nio-8080-exec-3]
o.s.w.s.r.ResourceHttpRequestHandler : Resource not found
2022-03-08 11:04:45.473 DEBUG 46576 --- [nio-8080-exec-3]
o.s.web.servlet.DispatcherServlet : Exiting from "FORWARD"
dispatch, status 404 2022-03-08 11:04:45.473 DEBUG 46576 ---
[nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Completed
404 NOT_FOUND 2022-03-08 11:04:45.474 DEBUG 46576 ---
[nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : "ERROR"
dispatch for GET "/error?email=tim#gmail.com", parameters={masked}
2022-03-08 11:04:45.475 DEBUG 46576 --- [nio-8080-exec-3]
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to
org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
2022-03-08 11:04:45.482 DEBUG 46576 --- [nio-8080-exec-3]
o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using 'application/json',
given [/] and supported [application/json, application/+json,
application/json, application/+json] 2022-03-08 11:04:45.483 DEBUG
46576 --- [nio-8080-exec-3] o.s.w.s.m.m.a.HttpEntityMethodProcessor :
Writing [{timestamp=Tue Mar 08 11:04:45 IST 2022, status=404,
error=Not Found, path=/tweet2}] 2022-03-08 11:04:45.497 DEBUG 46576
--- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Exiting from "ERROR" dispatch, status 404
Here is the code I wrote:
#GetMapping("/tweet2")
public ModelAndView getTweetsByEmail(#RequestParam String email) {
ModelAndView modelAndView = new ModelAndView("tweets");
List<Tweet> tweets = tweetMap.get(email);
modelAndView.getModel().put("tweets",tweets);
return modelAndView;
}
And there is a tweets.mustache file under the resources folder. Not sure why its unable to detect it

Hibernate not flushing entity update on transaction commit

This is the transactional service defining the method I use to create a UserCommit and explicitly persisting it (this part works), and in the meantime updating the lastCommit field of the already existent parent entity User. This update doesn't get flushed.
#Transactional
#Service
public class UserCommitService {
#Autowired
private UserService userService;
#Autowired
private UserCommitRepository ucRepo;
public UserCommit createFrom(User user, Integer prodId, String ucType, String stage) {
UserCommit uc = new UserCommit();
uc.setUser(userService.findUserById(user.getId()));
uc.getUser().addUserCommit(uc);
uc.setTime(LocalDateTime.now());
uc.getUser().setLastCommit(uc.getTime());
ucRepo.save(uc);
return uc;
}
}
Here you can read the tracing log:
User gets correctly selected from DB
An inner transaction gets created for ucRepo.save (It's a CRUDRepo method, then I think it's normal) and userCommit gets correctly inserted into DB
EDIT
Why CrudRepository.save creates a new transaction instead of joining the existing one?
Outer transaction gets resumed, but even if the entity show the updated field, it seems this gets ignored by dirty checking, because no insert is logged on commit.
2020-05-31 12:52:36.405 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder#296e6024] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#1826475] bound to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:52:36.406 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(461939992<open>)] for JPA transaction
2020-05-31 12:52:36.406 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Creating new transaction with name [petmenu.services.users.UserCommitService.createFrom]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2020-05-31 12:52:36.407 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle#5ac66b8d]
2020-05-31 12:52:36.407 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.jdbc.datasource.ConnectionHolder#4905e3e7] for key [HikariDataSource (HikariPool-1)] to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:52:36.407 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Initializing transaction synchronization
2020-05-31 12:52:36.407 TRACE 7194 --- [.10-8080-exec-6] o.s.t.i.TransactionInterceptor : Getting transaction for [petmenu.services.users.UserCommitService.createFrom]
2020-05-31 12:53:24.212 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder#296e6024] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#1826475] bound to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:53:24.217 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(461939992<open>)] for JPA transaction
2020-05-31 12:53:24.221 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder#4905e3e7] for key [HikariDataSource (HikariPool-1)] bound to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:53:24.228 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Participating in existing transaction
2020-05-31 12:53:24.232 TRACE 7194 --- [.10-8080-exec-6] o.s.t.i.TransactionInterceptor : Getting transaction for [petmenu.services.users.UserService.findUserById]
2020-05-31 12:53:24.256 TRACE 7194 --- [.10-8080-exec-6] o.s.t.i.TransactionInterceptor : No need to create transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findUserById]: This method is not transactional.
2020-05-31 12:53:24.265 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.EntityManagerFactoryUtils : Opening JPA EntityManager
2020-05-31 12:53:24.271 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.orm.jpa.EntityManagerHolder#75c27c80] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#6c8672b9] to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:53:24.279 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder#75c27c80] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#6c8672b9] bound to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:53:24.288 DEBUG 7194 --- [.10-8080-exec-6] org.hibernate.SQL : select user0_.id as id1_0_, user0_.kc_id as kc_id2_0_, user0_.last_commit as last_com3_0_, user0_.name as name4_0_ from user user0_ where user0_.id=?
2020-05-31 12:53:24.298 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [INTEGER] - [6]
2020-05-31 12:53:24.309 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicExtractor : extracted value ([id1_0_] : [INTEGER]) - [6]
2020-05-31 12:53:24.317 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicExtractor : extracted value ([kc_id2_0_] : [VARCHAR]) - [80a3b4b1-00d1-4062-a7e5-1927b938c203]
2020-05-31 12:53:24.325 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicExtractor : extracted value ([last_com3_0_] : [TIMESTAMP]) - [null]
2020-05-31 12:53:24.332 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name4_0_] : [VARCHAR]) - [user1]
2020-05-31 12:53:24.342 TRACE 7194 --- [.10-8080-exec-6] o.s.t.i.TransactionInterceptor : Completing transaction for [petmenu.services.users.UserService.findUserById]
2020-05-31 12:55:07.918 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata#326a9afb] for key [public abstract java.lang.Object org.springframework.data.repository.CrudRepository.save(java.lang.Object)] to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:55:07.957 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder#75c27c80] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#6c8672b9] bound to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:55:07.961 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(1373582834<open>)] for JPA transaction
2020-05-31 12:55:07.966 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.orm.jpa.EntityManagerHolder#75c27c80] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#6c8672b9] from thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:55:07.970 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Clearing transaction synchronization
2020-05-31 12:55:07.975 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2020-05-31 12:55:07.980 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Opened new EntityManager [SessionImpl(756005269<open>)] for JPA transaction
2020-05-31 12:55:07.987 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle#6860e795]
2020-05-31 12:55:07.992 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.jdbc.datasource.ConnectionHolder#6374741f] for key [HikariDataSource (HikariPool-2)] to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:55:07.998 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.orm.jpa.EntityManagerHolder#4b2cad26] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#6c8672b9] to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:55:08.002 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Initializing transaction synchronization
2020-05-31 12:55:08.006 TRACE 7194 --- [.10-8080-exec-6] o.s.t.i.TransactionInterceptor : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2020-05-31 12:55:08.226 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder#4b2cad26] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#6c8672b9] bound to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:55:08.392 DEBUG 7194 --- [.10-8080-exec-6] org.hibernate.SQL : select nextval(hibernate_sequence)
2020-05-31 12:55:08.783 TRACE 7194 --- [.10-8080-exec-6] o.s.t.i.TransactionInterceptor : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2020-05-31 12:55:08.787 TRACE 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Triggering beforeCommit synchronization
2020-05-31 12:55:08.791 TRACE 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Triggering beforeCompletion synchronization
2020-05-31 12:55:08.796 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Initiating transaction commit
2020-05-31 12:55:08.800 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(756005269<open>)]
2020-05-31 12:55:08.824 DEBUG 7194 --- [.10-8080-exec-6] org.hibernate.SQL : insert into user_commit (uctype, prod_id, stage, time, user, id) values (?, ?, ?, ?, ?, ?)
2020-05-31 12:55:08.832 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [INTEGER] - [1]
2020-05-31 12:55:08.838 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [INTEGER] - [3]
2020-05-31 12:55:08.845 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [INTEGER] - [0]
2020-05-31 12:55:08.884 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [TIMESTAMP] - [2020-05-31T12:54:58.518530]
2020-05-31 12:55:08.922 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [INTEGER] - [6]
2020-05-31 12:55:08.929 TRACE 7194 --- [.10-8080-exec-6] o.h.type.descriptor.sql.BasicBinder : binding parameter [6] as [INTEGER] - [3003]
2020-05-31 12:55:09.043 TRACE 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Triggering afterCommit synchronization
2020-05-31 12:55:09.048 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Clearing transaction synchronization
2020-05-31 12:55:09.052 TRACE 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Triggering afterCompletion synchronization
2020-05-31 12:55:09.056 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.orm.jpa.EntityManagerHolder#4b2cad26] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#6c8672b9] from thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:55:09.062 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.jdbc.datasource.ConnectionHolder#6374741f] for key [HikariDataSource (HikariPool-2)] from thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:55:09.066 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Closing JPA EntityManager [SessionImpl(756005269<open>)] after transaction
2020-05-31 12:55:09.070 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Resuming suspended transaction after completion of inner transaction
2020-05-31 12:55:09.075 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Initializing transaction synchronization
2020-05-31 12:55:09.080 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.orm.jpa.EntityManagerHolder#75c27c80] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#6c8672b9] to thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:55:09.085 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata#326a9afb] for key [public abstract java.lang.Object org.springframework.data.repository.CrudRepository.save(java.lang.Object)] from thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:58:18.989 TRACE 7194 --- [.10-8080-exec-6] o.s.t.i.TransactionInterceptor : Completing transaction for [petmenu.services.users.UserCommitService.createFrom]
2020-05-31 12:58:18.997 TRACE 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Triggering beforeCommit synchronization
2020-05-31 12:58:19.001 TRACE 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Triggering beforeCompletion synchronization
2020-05-31 12:58:19.006 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.orm.jpa.EntityManagerHolder#75c27c80] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#6c8672b9] from thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:58:19.071 INFO 7194 --- [.10-8080-exec-6] o.h.c.i.AbstractPersistentCollection : HHH000496: Detaching an uninitialized collection with queued operations from a session: [petmenu.entities.users.User.userCommitList#6]
2020-05-31 12:58:19.075 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Initiating transaction commit
2020-05-31 12:58:19.081 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(461939992<open>)]
2020-05-31 12:58:19.095 TRACE 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Triggering afterCommit synchronization
2020-05-31 12:58:19.099 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Clearing transaction synchronization
2020-05-31 12:58:19.104 TRACE 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Triggering afterCompletion synchronization
2020-05-31 12:58:19.109 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.jdbc.datasource.ConnectionHolder#4905e3e7] for key [HikariDataSource (HikariPool-1)] from thread [http-nio-192.168.1.10-8080-exec-6]
2020-05-31 12:58:19.113 DEBUG 7194 --- [.10-8080-exec-6] o.s.orm.jpa.JpaTransactionManager : Not closing pre-bound JPA EntityManager after transaction
2020-05-31 12:59:07.063 TRACE 7194 --- [.10-8080-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.orm.jpa.EntityManagerHolder#296e6024] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#1826475] from thread [http-nio-192.168.1.10-8080-exec-6]
EDIT2
I tried to remove the CrudRepository.save call, because it behaves strangely, creating a new transaction on its own, and seems responsible for previous one closing. The log becomes a little more logic, but still User.lastCommit new value doesn't get flushed.
2020-06-01 11:39:10.518 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder#5f0cca8f] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#27bbe773] bound to thread [http-nio-192.168.1.10-8080-exec-2]
2020-06-01 11:39:10.518 DEBUG 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(2096513672<open>)] for JPA transaction
2020-06-01 11:39:10.518 DEBUG 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Creating new transaction with name [petmenu.services.users.UserCommitService.createFrom]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2020-06-01 11:39:10.518 DEBUG 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle#62cbdd03]
2020-06-01 11:39:10.519 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.jdbc.datasource.ConnectionHolder#4b988820] for key [HikariDataSource (HikariPool-1)] to thread [http-nio-192.168.1.10-8080-exec-2]
2020-06-01 11:39:10.519 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Initializing transaction synchronization
2020-06-01 11:39:10.519 TRACE 26420 --- [.10-8080-exec-2] o.s.t.i.TransactionInterceptor : Getting transaction for [petmenu.services.users.UserCommitService.createFrom]
2020-06-01 11:39:16.678 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder#5f0cca8f] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#27bbe773] bound to thread [http-nio-192.168.1.10-8080-exec-2]
2020-06-01 11:39:16.683 DEBUG 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(2096513672<open>)] for JPA transaction
2020-06-01 11:39:16.688 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder#4b988820] for key [HikariDataSource (HikariPool-1)] bound to thread [http-nio-192.168.1.10-8080-exec-2]
2020-06-01 11:39:16.693 DEBUG 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Participating in existing transaction
2020-06-01 11:39:16.697 TRACE 26420 --- [.10-8080-exec-2] o.s.t.i.TransactionInterceptor : Getting transaction for [petmenu.services.users.UserService.findUserById]
2020-06-01 11:39:16.720 TRACE 26420 --- [.10-8080-exec-2] o.s.t.i.TransactionInterceptor : No need to create transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findUserById]: This method is not transactional.
2020-06-01 11:39:16.727 DEBUG 26420 --- [.10-8080-exec-2] o.s.orm.jpa.EntityManagerFactoryUtils : Opening JPA EntityManager
2020-06-01 11:39:16.733 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.orm.jpa.EntityManagerHolder#ca14c2f] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#161c9468] to thread [http-nio-192.168.1.10-8080-exec-2]
2020-06-01 11:39:16.738 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder#ca14c2f] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#161c9468] bound to thread [http-nio-192.168.1.10-8080-exec-2]
2020-06-01 11:39:16.747 DEBUG 26420 --- [.10-8080-exec-2] org.hibernate.SQL : select user0_.id as id1_0_, user0_.kc_id as kc_id2_0_, user0_.last_commit as last_com3_0_, user0_.name as name4_0_ from user user0_ where user0_.id=?
2020-06-01 11:39:16.754 TRACE 26420 --- [.10-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [INTEGER] - [6]
2020-06-01 11:39:16.763 TRACE 26420 --- [.10-8080-exec-2] o.h.type.descriptor.sql.BasicExtractor : extracted value ([id1_0_] : [INTEGER]) - [6]
2020-06-01 11:39:16.772 TRACE 26420 --- [.10-8080-exec-2] o.h.type.descriptor.sql.BasicExtractor : extracted value ([kc_id2_0_] : [VARCHAR]) - [80a3b4b1-00d1-4062-a7e5-1927b938c203]
2020-06-01 11:39:16.779 TRACE 26420 --- [.10-8080-exec-2] o.h.type.descriptor.sql.BasicExtractor : extracted value ([last_com3_0_] : [TIMESTAMP]) - [null]
2020-06-01 11:39:16.787 TRACE 26420 --- [.10-8080-exec-2] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name4_0_] : [VARCHAR]) - [user1]
2020-06-01 11:39:16.795 TRACE 26420 --- [.10-8080-exec-2] o.s.t.i.TransactionInterceptor : Completing transaction for [petmenu.services.users.UserService.findUserById]
2020-06-01 11:39:48.779 TRACE 26420 --- [.10-8080-exec-2] o.s.t.i.TransactionInterceptor : Completing transaction for [petmenu.services.users.UserCommitService.createFrom]
2020-06-01 11:39:48.780 TRACE 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Triggering beforeCommit synchronization
2020-06-01 11:39:48.780 TRACE 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Triggering beforeCompletion synchronization
2020-06-01 11:39:48.780 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.orm.jpa.EntityManagerHolder#ca14c2f] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean#161c9468] from thread [http-nio-192.168.1.10-8080-exec-2]
2020-06-01 11:39:48.782 INFO 26420 --- [.10-8080-exec-2] o.h.c.i.AbstractPersistentCollection : HHH000496: Detaching an uninitialized collection with queued operations from a session: [petmenu.entities.users.User.userCommitList#6]
2020-06-01 11:39:48.782 DEBUG 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Initiating transaction commit
2020-06-01 11:39:48.782 DEBUG 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(2096513672<open>)]
2020-06-01 11:39:48.787 TRACE 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Triggering afterCommit synchronization
2020-06-01 11:39:48.787 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Clearing transaction synchronization
2020-06-01 11:39:48.787 TRACE 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Triggering afterCompletion synchronization
2020-06-01 11:39:48.787 TRACE 26420 --- [.10-8080-exec-2] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.jdbc.datasource.ConnectionHolder#4b988820] for key [HikariDataSource (HikariPool-1)] from thread [http-nio-192.168.1.10-8080-exec-2]
2020-06-01 11:39:48.787 DEBUG 26420 --- [.10-8080-exec-2] o.s.orm.jpa.JpaTransactionManager : Not closing pre-bound JPA EntityManager after transaction
I spent just 4 days to realize the what the problem was. Awesome...(To be honest, I took advantage of all the stuff I had to read about JPA and Hibernate to get rid completely of OSIV).
When I defined my two datasources (Products and Users) configs, I annotated all the classes inside ProductsDataSourceConfiguration as #Primary, making them the default values when called without explicitly setting a name.
The problem was with PlatformTransactionManager in it, that was called as transaction manager for both my datasources, while actually being crafted just for Products one.
To solve the issue I had to specify the secondary transaction manager name on #Transactional annotation used on methods referring to secondary (Users) datasource:
#Transactional("usersTransactionManager")
#Service
public class UserCommitService {
...

Spring Data JPA: AccessType.Field empty response

Spring Boot 2.2.6
Spring Data JPA 2.2.7
I created an entity and placed the field annotation above the field. This should ensure that the access type is "field" - but it doesn't.
If I make a request, I get no error and the response is an array with empty objects.
If I place the corresponding getter into the class, then everything works. Can you see, where I forgot something?
entity
#Entity
#EntityListeners(AuditingEntityListener.class)
#JsonIgnoreProperties(value = {"createdAt", "updatedAt"})
public class Club implements Serializable {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
}
controller
#CrossOrigin
#RestController
#RequestMapping("/api")
public class ClubController {
#Autowired
private ClubRepository clubRepository;
#GetMapping("/clubs")
List<Club> getAllClubs() {
return clubRepository.findAll();
}
}
log
logging.level.org.hibernate = DEBUG
logging.level.org.springframework.web = DEBUG
2020-05-06 12:47:08.365 DEBUG 6379 --- [nio-8080-exec-4]
o.s.web.servlet.DispatcherServlet : GET "/api/clubs",
parameters={}
2020-05-06 12:47:08.365 DEBUG 6379 --- [nio-8080-exec-4]
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to
com.manager.api.club.ClubController#getAllClubs()
2020-05-06 12:47:08.369 DEBUG 6379 --- [nio-8080-exec-4]
o.h.e.t.internal.TransactionImpl : On TransactionImpl
creation, JpaCompliance#isJpaTransactionComplianceEnabled == false
2020-05-06 12:47:08.369 DEBUG 6379 --- [nio-8080-exec-4]
o.h.e.t.internal.TransactionImpl : begin
2020-05-06 12:47:08.371 DEBUG 6379 --- [nio-8080-exec-4]
o.h.q.c.internal.CriteriaQueryImpl : Rendered criteria query ->
select generatedAlias0 from Club as generatedAlias0
2020-05-06 12:47:08.371 DEBUG 6379 --- [nio-8080-exec-4]
org.hibernate.SQL :
select
club0_.id as id1_0_
from
Club club0_
Hibernate:
select
club0_.id as id1_0_
from
Club club0_
2020-05-06 12:47:08.372 DEBUG 6379 --- [nio-8080-exec-4]
org.hibernate.loader.Loader : Result set row: 0
2020-05-06 12:47:08.373 DEBUG 6379 --- [nio-8080-exec-4]
org.hibernate.loader.Loader : Result row:
EntityKey[com.manager.api.club.Club#1]
2020-05-06 12:47:08.373 DEBUG 6379 --- [nio-8080-exec-4]
org.hibernate.loader.Loader : Result set row: 1
2020-05-06 12:47:08.373 DEBUG 6379 --- [nio-8080-exec-4]
org.hibernate.loader.Loader : Result row:
EntityKey[com.manager.api.club.Club#2]
2020-05-06 12:47:08.373 DEBUG 6379 --- [nio-8080-exec-4]
o.h.engine.internal.TwoPhaseLoad : Resolving attributes for
[com.manager.api.club.Club#1]
2020-05-06 12:47:08.373 DEBUG 6379 --- [nio-8080-exec-4]
o.h.engine.internal.TwoPhaseLoad : Done materializing entity
[com.manager.api.club.Club#1]
2020-05-06 12:47:08.373 DEBUG 6379 --- [nio-8080-exec-4]
o.h.engine.internal.TwoPhaseLoad : Resolving attributes for
[com.manager.api.club.Club#2]
2020-05-06 12:47:08.373 DEBUG 6379 --- [nio-8080-exec-4]
o.h.engine.internal.TwoPhaseLoad : Done materializing entity
[com.manager.api.club.Club#2]
2020-05-06 12:47:08.373 DEBUG 6379 --- [nio-8080-exec-4]
o.h.e.t.internal.TransactionImpl : committing
2020-05-06 12:47:08.375 DEBUG 6379 --- [nio-8080-exec-4]
m.m.a.RequestResponseBodyMethodProcessor : Using
'application/json;q=0.8', given [text/html, application/xhtml+xml,
image/webp, image/apng, application/xml;q=0.9, application/signed-
exchange;v=b3;q=0.9, */*;q=0.8] and supported [application/json,
application/*+json, application/json, application/*+json]
2020-05-06 12:47:08.376 DEBUG 6379 --- [nio-8080-exec-4]
m.m.a.RequestResponseBodyMethodProcessor : Writing
[[com.manager.api.club.Club#59ae401f,
com.manager.api.club.Club#6afd7de2]]
2020-05-06 12:47:08.379 DEBUG 6379 --- [nio-8080-exec-4]
o.s.web.servlet.DispatcherServlet : Completed 200 OK

Spring - Same entity detached on the #EventListener but attached in the #Service class

I have following classes in my Spring application: TaskService and DevStartup.
When application starts DevStartup is run, but the Tag("Home") is seen as detached entity on tasksRepository.save(task) which throws detached entity exception during startup.
#Component
#AllArgsConstructor
#Slf4j
#Profile("dev")
public class DevStartup {
private final TagsService tagsService;
private final TagsRepository tagsRepository;
private final TasksRepository tasksRepository;
private final Clock clock;
private final EntityManager entityManager;
#EventListener(ApplicationReadyEvent.class)
public void initializeApplication() {
insertTags();
insertTasks();
}
private void insertTags() {
List<Tag> tags = Arrays.asList(
new Tag("Home")
);
tagsRepository.saveAll(tags);
}
private void insertTasks() {
Task task = new Task("Run a webinar", "Zoom.us", clock.time());
Set<Tag> tagsForTask = Stream.of("Home")
.map(tag -> tagsService.findByName(tag).orElseGet(() -> new Tag(tag)))
.collect(Collectors.toSet());
task.addTags(tagsForTask);
tasksRepository.save(task); // ERROR -> Tag("Home") Entity Detached!!!!!
}
}
At the same time I'm having exact code in the TaskService class and I call it with the same arguments from my REST Controller.
addTask("Task title", "Task description", Stream.of("Home").collect(toSet());
And this time, the Tag("Home") entity is attached
#Service
#RequiredArgsConstructor
public class TasksService {
private final StorageService storageService;
private final TasksRepository tasksRepository;
private final TagsService tagsService;
private final Clock clock;
private final EntityManager entityManager;
public Task addTask(String title, String description, Set<String> tags) {
Task task = new Task(
title,
description,
clock.time()
);
Set<Tag> tagsForTask = tags.stream()
.map(tag -> tagsService.findByName(tag).orElseGet(() -> new Tag(tag)))
.collect(Collectors.toSet());
task.addTags(tagsForTask);
tasksRepository.save(task); // OK -> Tag("Home") Entity Attached
return task;
}
// ...
}
What is the difference between those two and why entity is detached in one case and attached in the other?
I am using Spring Boot 2.1.9 with Hibernate 5 and JPA (Spring Data JPA project).
TagsService.findByName() is just calling TagsRepository.findByNameContainingIgnoreCase:
public interface TagsRepository extends JpaRepository<Tag, Long> {
Optional<Tag> findByNameContainingIgnoreCase(String name);
}
Update
Here are the trace logs from DevStartup. I can spot that session is closed right after fetching the Tag from TagService, and then opened again for saving Task (this is why I'm getting the detached entity exception).
2020-01-25 23:06:46.774 TRACE 33093 --- [ restartedMain] org.hibernate.internal.SessionImpl : Automatically flushing session
2020-01-25 23:06:46.778 TRACE 33093 --- [ restartedMain] org.hibernate.internal.SessionImpl : SessionImpl#afterTransactionCompletion(successful=true, delayed=false)
2020-01-25 23:06:46.779 TRACE 33093 --- [ restartedMain] org.hibernate.internal.SessionImpl : Closing session [d8094673-13fd-4b7e-af38-4aa01afbcaf7]
2020-01-25 23:06:46.789 TRACE 33093 --- [ restartedMain] org.hibernate.internal.SessionImpl : Opened Session [d2c0c551-6523-466f-ab07-a8c1455c62a4] at timestamp: 1579990006789
2020-01-25 23:06:46.848 DEBUG 33093 --- [ restartedMain] org.hibernate.SQL : select tag0_.id as id1_2_, tag0_.name as name2_2_ from tag tag0_ where upper(tag0_.name) like upper(?) escape ?
Hibernate: select tag0_.id as id1_2_, tag0_.name as name2_2_ from tag tag0_ where upper(tag0_.name) like upper(?) escape ?
2020-01-25 23:06:46.850 TRACE 33093 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [%Home%]
2020-01-25 23:06:46.850 TRACE 33093 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [CHAR] - [\]
2020-01-25 23:06:46.855 TRACE 33093 --- [ restartedMain] org.hibernate.internal.SessionImpl : Closing session [d2c0c551-6523-466f-ab07-a8c1455c62a4]
2020-01-25 23:06:46.860 TRACE 33093 --- [ restartedMain] org.hibernate.internal.SessionImpl : Opened Session [6caeb288-a608-4aa7-a5f9-091c69900815] at timestamp: 1579990006860
2020-01-25 23:06:46.867 DEBUG 33093 --- [ restartedMain] org.hibernate.SQL : insert into task (id, uuid, created_at, description, title) values (null, ?, ?, ?, ?)
Hibernate: insert into task (id, uuid, created_at, description, title) values (null, ?, ?, ?, ?)
2020-01-25 23:06:46.868 TRACE 33093 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [fc9c993b-eccf-45ff-b49a-12498b6e62eb]
2020-01-25 23:06:46.868 TRACE 33093 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [TIMESTAMP] - [2020-01-25T23:06:46.785455]
2020-01-25 23:06:46.870 TRACE 33093 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARCHAR] - [Zoom.us]
2020-01-25 23:06:46.872 TRACE 33093 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [VARCHAR] - [Run a webinar]
2020-01-25 23:06:46.879 TRACE 33093 --- [ restartedMain] org.hibernate.internal.SessionImpl : SessionImpl#afterTransactionCompletion(successful=false, delayed=false)
2020-01-25 23:06:46.880 TRACE 33093 --- [ restartedMain] org.hibernate.internal.SessionImpl : Closing session [6caeb288-a608-4aa7-a5f9-091c69900815]
2020-01-25 23:06:46.900 ERROR 33093 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed
Below are the logs when running code from TaskService. The session is not closed between fetching tags and saving tasks.
2020-01-25 23:10:24.966 TRACE 33194 --- [ restartedMain] org.hibernate.internal.SessionImpl : Closing session [f3ea3806-3c65-4269-81b4-ba8bc1abf2af]
2020-01-25 23:10:55.518 INFO 33194 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-01-25 23:10:55.519 INFO 33194 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-01-25 23:10:55.533 INFO 33194 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 14 ms
2020-01-25 23:10:55.553 TRACE 33194 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl : Opened Session [61d3d232-2d92-4002-8e4c-cedb0278a2e9] at timestamp: 1579990255552
2020-01-25 23:10:55.858 INFO 33194 --- [nio-8080-exec-1] p.s.t.tasks.boundary.TasksController : Storing new task: CreateTaskRequest(title=Dokończyć Moduł 8, description=Jpa i Hibernate cz. 2, attachmentComment=null, tags=[Home])
2020-01-25 23:10:55.914 DEBUG 33194 --- [nio-8080-exec-1] org.hibernate.SQL : select tag0_.id as id1_2_, tag0_.name as name2_2_ from tag tag0_ where upper(tag0_.name) like upper(?) escape ?
Hibernate: select tag0_.id as id1_2_, tag0_.name as name2_2_ from tag tag0_ where upper(tag0_.name) like upper(?) escape ?
2020-01-25 23:10:55.920 TRACE 33194 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [%Home%]
2020-01-25 23:10:55.920 TRACE 33194 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [CHAR] - [\]
2020-01-25 23:10:59.218 DEBUG 33194 --- [nio-8080-exec-1] org.hibernate.SQL : insert into task (id, uuid, created_at, description, title) values (null, ?, ?, ?, ?)
Hibernate: insert into task (id, uuid, created_at, description, title) values (null, ?, ?, ?, ?)
2020-01-25 23:10:59.218 TRACE 33194 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [bac8dacb-9424-4c6e-9a3a-860973ebc350]
2020-01-25 23:10:59.219 TRACE 33194 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [TIMESTAMP] - [2020-01-25T23:10:55.878153]
2020-01-25 23:10:59.223 TRACE 33194 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARCHAR] - [Jpa i Hibernate cz. 2]
2020-01-25 23:10:59.224 TRACE 33194 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [VARCHAR] - [Dokończyć Moduł 8]
2020-01-25 23:10:59.244 TRACE 33194 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl : SessionImpl#beforeTransactionCompletion()
2020-01-25 23:10:59.244 TRACE 33194 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl : Automatically flushing session
2020-01-25 23:10:59.262 DEBUG 33194 --- [nio-8080-exec-1] org.hibernate.SQL : insert into tags_tasks (task_id, tag_id) values (?, ?)
Hibernate: insert into tags_tasks (task_id, tag_id) values (?, ?)
2020-01-25 23:10:59.263 TRACE 33194 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1]
2020-01-25 23:10:59.264 TRACE 33194 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [BIGINT] - [1]
2020-01-25 23:10:59.273 TRACE 33194 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl : SessionImpl#afterTransactionCompletion(successful=true, delayed=false)
Most likely, you have Open Session In View enabled
If you are running a web application, Spring Boot by default registers OpenEntityManagerInViewInterceptor to apply the “Open EntityManager in View” pattern, to allow for lazy loading in web views. If you do not want this behavior, you should set spring.jpa.open-in-view to false in your application.properties.
This will open the session when request starts and and closes it after the request processing is done. The interceptor is run for web request, but not in case of ApplicationReadyEvent event listener.
You may want to use #Transactional to extend the lifetime of the session when you are not relying on open session in view. See https://stackoverflow.com/a/24713402/1570854:
In Spring, there is a one-to-one correspondence between the business transaction demarcated by #Transactional, and the hibernate Session.
That is, when a business transaction is begun by invoking a #Transactional method, the hibernate session is created (a TransactionManager may delay the actual creation until the session is first used). Once that method completes, the business transaction is committed or rolled back, which closes the hibernate session.
Many consider open session in view to be an anti-pattern: https://vladmihalcea.com/the-open-session-in-view-anti-pattern/

Spring Boot : Having a custom annotation on spring rest controller class causing error in identifying handler mapping

I am using a custom annotation called #Toggle on top of a rest controller class in spring boot to intercept the handlerType to block rest calls.
See below code snippet:
#RestController
#Toggle(feature="feature.foo")
#RequestMapping("/foo")
public class FooController {
#RequestMapping("")
public Map hello() {
return Collections.singletonMap("message", "hello foo!");
}
}
But I am not able to access the api which fails even before dispatcher servlet find the handler method.
2018-02-17 18:51:31.520 DEBUG 73947 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/foo]
2018-02-17 18:51:31.521 DEBUG 73947 --- [nio-8080-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /foo
2018-02-17 18:51:31.523 DEBUG 73947 --- [nio-8080-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/foo]
2018-02-17 18:51:31.523 DEBUG 73947 --- [nio-8080-exec-2] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/foo] are [/**]
2018-02-17 18:51:31.523 DEBUG 73947 --- [nio-8080-exec-2] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/foo] are {}
2018-02-17 18:51:31.524 DEBUG 73947 --- [nio-8080-exec-2] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/foo] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver#333c8791]]] and 1 interceptor
2018-02-17 18:51:31.524 DEBUG 73947 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/foo] is: -1
2018-02-17 18:51:31.525 DEBUG 73947 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2018-02-17 18:51:31.525 DEBUG 73947 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Successfully completed request
2018-02-17 18:51:31.529 DEBUG 73947 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/error]
2018-02-17 18:51:31.529 DEBUG 73947 --- [nio-8080-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /error
2018-02-17 18:51:31.529 DEBUG 73947 --- [nio-8080-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)]
2018-02-17 18:51:31.530 DEBUG 73947 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/error] is: -1
Found below logs which can throw some more light on the problem.
2018-02-17 20:30:24.172 DEBUG 94537 --- [ main] .i.s.PathMatchingResourcePatternResolver : Resolved location pattern [classpath*:in/karthick/spring/**/*.class] to resources [file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/AppConfig.class], file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/Constants.class], file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/FeatureToggleApplication.class], file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/web/FooController.class], file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/web/HelloController.class]]
2018-02-17 20:30:24.172 TRACE 94537 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/AppConfig.class]
2018-02-17 20:30:24.190 DEBUG 94537 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Identified candidate component class: file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/AppConfig.class]
2018-02-17 20:30:24.191 TRACE 94537 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/Constants.class]
2018-02-17 20:30:24.191 TRACE 94537 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Ignored because not matching any filter: file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/Constants.class]
2018-02-17 20:30:24.191 TRACE 94537 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/FeatureToggleApplication.class]
2018-02-17 20:30:24.196 TRACE 94537 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Ignored because not matching any filter: file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/FeatureToggleApplication.class]
2018-02-17 20:30:24.196 TRACE 94537 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/web/FooController.class]
2018-02-17 20:30:24.205 TRACE 94537 --- [ main] o.s.c.e.PropertySourcesPropertyResolver : Searching for key 'feature.foo' in [servletConfigInitParams]
2018-02-17 20:30:24.205 TRACE 94537 --- [ main] o.s.c.e.PropertySourcesPropertyResolver : Searching for key 'feature.foo' in [servletContextInitParams]
2018-02-17 20:30:24.205 TRACE 94537 --- [ main] o.s.c.e.PropertySourcesPropertyResolver : Searching for key 'feature.foo' in [systemProperties]
2018-02-17 20:30:24.206 TRACE 94537 --- [ main] o.s.c.e.PropertySourcesPropertyResolver : Searching for key 'feature.foo' in [systemEnvironment]
2018-02-17 20:30:24.206 TRACE 94537 --- [ main] o.s.c.e.PropertySourcesPropertyResolver : Searching for key 'feature.foo' in [random]
2018-02-17 20:30:24.206 TRACE 94537 --- [ main] o.s.c.e.PropertySourcesPropertyResolver : Searching for key 'feature.foo' in [applicationConfigurationProperties]
2018-02-17 20:30:24.206 DEBUG 94537 --- [ main] o.s.c.e.PropertySourcesPropertyResolver : Could not find key 'feature.foo' in any property source
2018-02-17 20:30:24.210 TRACE 94537 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Ignored because not matching any filter: file [/Users/karthick/feature-toggles/target/classes/in/karthick/spring/web/FooController.class]
However, if I use the same #Toggle annotation on a method inside rest controller class, the handler mapping finds the right method to invoke.
#RequestMapping("/foo")
#Toggle(feature = "feature.foo")
public Map hello() {
return Collections.singletonMap("message", "hello foo!");
}
How can I make sure spring boot maps to right handler method even if I use custom annotation on top of rest controller.

Resources