Настройте метод save () в Spring Roo - PullRequest
1 голос
/ 24 ноября 2011

Я подал заявку в Spring Roo (я все еще новичок), и я хотел бы выполнить некоторую обработку после того, как сущность будет сохранена. Я настроил приложение со слоем Service и DAO. В сервисе я создал пользовательский метод triggerChange (MyEntity myEntity). Мне бы хотелось, чтобы этот метод вызывался после сохранения объекта, но я не знаю, как я могу вызвать этот метод без изменения * ServiceImpl_Roo_Service, управляемого Roo (который не должен редактироваться).

Итак, у меня есть такой код:

Услуга:

public class MyEntityServiceImpl implements MyEntityService {
    //this is the method I want to invoke inside or after invoking save()
    public void triggerChange(MyEntity myEntity) {
        ...
    }
}

Аспект услуги:

privileged aspect MyEntityServiceImpl_Roo_Service {
    ...
    public void MyEntityServiceImpl.saveMyEntity(MyEntity myEntity) {
        myEntityRepository.save(myEntity);
    }

}

Как я могу настроить метод сохранения?

Спасибо

Ответы [ 3 ]

4 голосов
/ 24 ноября 2011

Благодаря Roo в вашем приложении Spring включен AspectJ. Просто создайте Aspect (после или около вызова метода)

Вы также можете перемещать методы из Roo аспектов (.aj)

В STS выберите требуемые методы (и даже атрибуты) из класса аспектов, щелкните правой кнопкой мыши, refactor-> push in ... и нажмите Review-OK или OK напрямую (я рекомендую первый для просмотра изменений)

Другой способ: при запущенном Roo просто создайте метод / атрибут с той же сигнатурой в классе. Roo удалит эквивалент из аспекта.

3 голосов
/ 24 ноября 2011

Один из способов сделать это - использовать события JPA или Hibernate.

Посмотрите этот блог (автор очень активный пользователь SO), он объясняет, какSpring Beans можно использовать для таких мероприятий.

0 голосов
/ 30 ноября 2011

Мне просто нужно было выполнить некоторую бизнес-логику после метода сохранения, как вы и хотели.

Допустим, мне нужно зарегистрировать, что была выполнена операция сохранения. Для этого я создал этот аспект:

package com.malsolo.aspects;

import org.apache.log4j.Logger;
import com.malsolo.myproject.domain.MyEntity;

aspect MyEntityAspect {

    private final Logger logger = Logger.getLogger(MyEntityAspect.class);

    pointcut persistEntity() : execution(* MyEntity.persist(..));

    public Logger getLogger() {
        return logger;
    }

    after() : persistEntity() {
        logger().info("Entity persisted "+thisJoinPoint);
    }

}

пишет:

2011-11-30 11: 47: 27,056 [главная] ИНФОРМАЦИЯ com.malsolo.aspect.ModifyRolAspect - постоянное выполнение сущности (пусто com.malsolo.myproject.domain.MyEntity.persist ())

Надеюсь, это поможет вам.

Примечания:

  • Я использую Roo 1.1.5 с подходом @Entity, у меня нет сервисного уровня
  • Обратите внимание на импорт сущности. Это не сработает без этого.
  • Если вы используете STS с AJDT, вы увидите примененные рекомендации.
...