Pregunta

Quería establecer el TransactionManager en función de algunos criterios de entrada y, por lo tanto, pasé de la gestión de transacciones declarativas a programáticas.

algo como

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

Todo funciona bien, pero envuelve cada llamada de servicio (nuestro límite de transacciones está en el nivel de servicio al cliente de GWT. a @Transactional. ¿Puede haber una forma más fácil de hacer esto? ¿Quizás un enfoque basado en AOP?

Probé lo siguiente

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

El código se ejecuta bien dentro del contexto transaccional y el 'resultado' contiene el valor correcto (el usuario recién guardado) pero la persona que llama del método SaveUser (capa de widget GWT) siempre obtiene un objeto nulo. Este no es un problema con GWT ya que lo probé independientemente de GWT también. Todo parece estar bien hasta el 'resultado'. Después de esto se pierde el objeto. ¿Cuál podría ser la posible razón y solución para el problema?

¿Fue útil?

Solución

La persona que llama obtiene un objeto nulo porque no devuelve nada de su método:

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

No está muy claro por qué necesitas hacer esto tú mismo en lugar de dejar el @Transactional Soporte de primavera hágalo por ti.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top