Ho difficoltà a trovare una soluzione al mio problema.
Ho una classe di servizio, che contiene un metodo per impostare un flag di verifica al momento dell'accesso.TransactionRequiredException: Esecuzione di una query di aggiornamento/eliminazione
@Service("userRolesService")
@Repository
@Transactional
public class UserRolesService {
public void verify() {
repository.verifyUser();
}
}
mio repository è uno SpringData CrudRepository e verifyUser è qualcosa come
@Modifying
@Query("UPDATE user SET (verified = 1 WHERE verified=0)")
public void verifyUser();
Quando si chiama il codice direttamente in un test di unità, tutto funziona bene. Quando si chiama dal mio provider di autenticazione attraverso l'applicazione ottengo la seguente eccezione:
javax.persistence.TransactionRequiredException
: Esecuzione di un aggiornamento/query di eliminazione
la classe di servizio viene iniettato in entrambi la mia prova di unità e il provider di autenticazione usando l'annotazione @Autowired
. Il test in sé non ha annotazioni interessanti, né il provider di autenticazione.
Sono fresco di idee, quindi se qualcuno ha la minima idea, sarei molto grato.
MODIFICA: Invece di chiamare lo script di aggiornamento di verifyUser, ora richiama tutti gli utenti non verificati, imposta il flag verificato e utilizza il metodo save() del repository. Funziona, ma è molto brutto, quindi sono aperto a suggerimenti migliori.
EDIT2:
Per richiesta qui è la parte persistenza della configurazione, credo che questo è più rilevante, il resto si occupa solo con l'autenticazione. Questa configurazione è utilizzata sia nel test unitario che nell'applicazione web, l'unica differenza è che le origini dati sono incorporate in H2 DB per le unit test e mysql per l'app web.
<beans [..]>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
depends-on="persistenceInitializer">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceUnitName" value="jpa"/>
<property name="packagesToScan">
<list>
<value>com.example.model</value>
</list>
</property>
<property name="jpaVendorAdapter">
<bean class="com.example.persistence.adapter.ConfigurationRetainingHibernateJpaVendorAdapter">
<property name="database" value="${spring.hibernate.database}"/>
<property name="generateDdl" value="${spring.hibernate.generateDdl}"/>
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.DefaultComponentSafeNamingStrategy
</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<jpa:repositories base-package="com.example.persistence.repository"/>
<tx:annotation-driven/>
<bean id="persistenceInitializer" class="com.example.persistence.init.NoOpInitializer"/>
</beans>
Inoltre ho una configurazione che è solo nella web app, non i test di unità:
<beans [..]>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:application.properties</value>
</list>
</property>
</bean>
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
<context:annotation-config/>
</beans>
Volete pubblicare il tuo Primavera config? Sembra che il tuo post processor di Transaction non stia trovando il bean? – MarkOfHall
Certo, ho aggiunto due parti di configurazione. Config è diviso in diversi file, ma la maggior parte di essi non dovrebbe essere rilevante per questo problema. – pushy