Режим нескольких арендаторов схемы Grails: слушатели GORM работают только с арендатором по умолчанию - PullRequest
0 голосов
/ 11 февраля 2019

Я адаптирую существующий проект Grails 3 к мультитенантной структуре, используя режим схемы, предоставляемый GORM, и у меня возникают проблемы с работой прослушивателей GORM, когда я задаю арендатора.

Мой слушатель выглядит так:

@CompileStatic
class VehicleListenerService {

    @Listener(Vehicle)
    void onPreInsertEvent(PreInsertEvent event) {
        println "*** Vehicle preInsert"
        event.entityAccess.setProperty('model', 'preInsert')
    }

    @Listener(Vehicle)
    void onPreUpdateEvent(PreUpdateEvent event) {
        println "*** Vehicle preUpdate"
        event.entityAccess.setProperty('model', 'preUpdate')
    }

}

Таким образом, каждый раз, когда автомобиль создается или обновляется, его модель следует менять на preInsert или preUpdate.

Текущий арендатор определяется поддоменом, указанным в URL.Если я получаю доступ к приложению без субдомена (через http://localhost:8080),, слушатель работает должным образом, но если я предоставляю субдомен (http://test.localhost:8080),, слушатель ничего не делает, а модель транспортного средства - нет).изменить.

Что мне нужно сделать, чтобы слушатель GORM работал с любым арендатором?

Я создал пример проекта (https://github.com/sneira/mtschema)который воспроизводит ошибку.

1 Ответ

0 голосов
/ 24 февраля 2019

С помощью канала Grails Slack и других исследований я нашел решение этой проблемы.

Сначала служба прослушивания должна расширить AbstractPersistenceEventListener:

@CompileStatic
class VehicleListenerService extends AbstractPersistenceEventListener {

    protected VehicleListenerService(Datastore datastore) {
        super(datastore)
    }

    @Override
    protected void onPersistenceEvent(AbstractPersistenceEvent event) {
        String newModel = 
                event.eventType == EventType.PreInsert ? 'preInsert' : 'preUpdate'
        event.entityAccess.setProperty('model', newModel)
    }

    @Override
    boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        boolean supportsEvent = eventType.isAssignableFrom(PreInsertEvent) ||
                eventType.isAssignableFrom(PreUpdateEvent)
        return supportsEvent
    }

}

Теперь мы можем создать экземпляр службы для каждой схемы (кроме стандартной) в Bootstrap.groovy и добавить его в наше приложение:

def init = { servletContext ->
    def ctx = grailsApplication.mainContext
    ['TEST', 'TEST2'].each { String name ->
        HibernateDatastore ds = hibernateDatastore.getDatastoreForConnection(name)
        VehicleListenerService listener = new VehicleListenerService(ds)
        ctx.addApplicationListener(listener)
    }
}

Я загрузил полный код в https://github.com/sneira/mtschema/tree/listeners.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...