Frage

Ich wollte den Transaktionsmanager auf der Grundlage einiger Eingabemittel festlegen und wechselte daher von deklarativ zum programmatischen Transaktionsmanagement.

etwas wie

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);
                }
              }
            });
 }

Alles funktioniert gut, aber um jeden Serviceanruf zu wickeln (unsere Transaktionsgrenze befindet sich auf der GWT-Client-Service-Ebene. nach @transactional. Kann es einen einfacheren Weg geben, dies zu tun? Vielleicht ein AOP -basierter Ansatz?

Ich habe Folgendes ausprobiert

//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;
            }
        }
    });
}

Der Code läuft im transaktionalen Kontext gut und das 'Ergebnis' enthält den richtigen Wert (den neu gespeicherten Benutzer), aber der Anrufer der SaveUser -Methode (GWT -Widget -Ebene) erhält immer ein Null -Objekt. Dies ist kein Problem mit GWT, da ich es auch unabhängig von GWT ausprobiert habe. Alles scheint in Ordnung zu sein, bis 'Ergebnis'. Danach geht das Objekt verloren. Was könnte der mögliche Grund und die mögliche Lösung für das Problem sein?

War es hilfreich?

Lösung

Der Anrufer erhält ein Null -Objekt, weil Sie nichts von Ihrer Methode zurückgeben:

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

Es ist nicht sehr klar, warum Sie dies selbst tun müssen, anstatt das zu lassen @Transactional Frühlingsunterstützung tun Sie es für Sie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top