Question

Je voulais mettre l'transactionManager en fonction de certains critères d'entrée et donc je suis passé de déclarative à la gestion programmatique des transactions.

quelque chose comme

public User saveUser(NewUser newUser){

     return transactionTemplate.execute(new TransactionCallback() {
              // the code in this method executes in a transactional context
              public Object doInTransaction(TransactionStatus status) {
                  try {
                        User savedObj = someService.saveUser(newUser);
        return savedObj ;
                } catch (DataManagerAPIException e) {
                    throw new RuntimeException(e);
                }
              }
            });
 }

Tout fonctionne bien, mais enveloppant tous les appels de service (notre limite de transaction est au level.Something service client GWT comme interface utilisateur -> Service client -> Service -> Dao) avec un rappel de transaction fait le bit de code un gâchis par rapport à @Transactional. il peut y avoir un moyen plus facile de le faire? Peut-être une approche basée sur les AOP?

J'ai essayé le suivant

//Wrap every Client service method with a transaction.

@Around("execution(* com.myProject.server.service.*.*(..))")
public void transactionManagerProviderResult(final ProceedingJoinPoint pjp) {

    transactionTemplate.execute(new TransactionCallback() {

        @Override
        public Object doInTransaction(TransactionStatus status) {
            try {
                            Object result = pjp.proceed();
            return result ;
            } catch (Throwable e) {
                e.printStackTrace();
                return null;
            }
        }
    });
}

Le code se exécute bien dans le contexte transactionnel et le « résultat » contient la bonne valeur (l'utilisateur nouvellement enregistré), mais l'appelant de la méthode saveUser (GWT couche Widget) obtient toujours un objet nul. Ce n'est pas un problème avec GWT depuis que je l'ai essayé indépendant de GWT aussi. Tout semble bien jusqu'à ce que « résultat ». Après cela, l'objet est perdu. Quelle pourrait être la raison possible et la solution pour la question?

Était-ce utile?

La solution

L'appelant obtient un objet nul parce que vous ne retournez pas quoi que ce soit de votre méthode:

public Object transactionManagerProviderResult(final ProceedingJoinPoint pjp) {
    return transactionTemplate.execute(new TransactionCallback() {
        // ...

Il est pas très clair pourquoi vous devez faire vous-même au lieu de laisser le support de ressort de @Transactional faites pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top