GroovyDynamicMethodsInterceptor - PullRequest
       11

GroovyDynamicMethodsInterceptor

1 голос
/ 17 апреля 2020

в любом случае можно использовать GroovyDynamicMethodsInterceptor в Grails 3.0.17. если нет, что я могу использовать вместо этого?

это часть моего кода ClinicianService. groovy:

package org.imedcom.server.provider

import org.codehaus.groovy.grails.web.metaclass.GroovyDynamicMethodsInterceptor
import org.codehaus.groovy.grails.web.metaclass.BindDynamicMethod
import grails.web.databinding.DataBinder
import org.imedcom.server.core.command.ClinicianCommand
import org.imedcom.server.core.command.CreateClinicianCommand
import org.imedcom.server.core.exception.ClinicianException
import org.imedcom.server.model.*
import org.springframework.transaction.annotation.Transactional
@Transactional
class ClinicianService {
    def springSecurityService
    def passwordService



    ClinicianService() {
        GroovyDynamicMethodsInterceptor i = new GroovyDynamicMethodsInterceptor(this)
        i.addDynamicMethodInvocation(new BindDynamicMethod())
    }

    Clinician createClinician(CreateClinicianCommand command) {
        def clinicianInstance = new Clinician(command.properties)
        clinicianInstance.user = new User(command.properties)
        clinicianInstance.user.enabled = true

        if (!clinicianInstance.user.validate()) {
            clinicianInstance.user.errors.fieldErrors.each {
                clinicianInstance.errors.rejectValue("user.${it.field}", it.code, it.arguments, it.defaultMessage)
            }
        }

        if (clinicianInstance.user.save(flush: true) && clinicianInstance.save(flush: true)) {
            updateRoleLinks(command.roleIds, clinicianInstance)
            updatePatientGroupLinks(command.groupIds, clinicianInstance)
        }

        return clinicianInstance
    }

    def updatePatientGroupLinks(List<Long> groupIds, Clinician clinician) {
        def oldPatientGroups = Clinician2PatientGroup.findAllByClinician(clinician)*.patientGroup

        def newPatientGroups = PatientGroup.findAllByIdInList(groupIds)

        newPatientGroups.each { patientGroup ->
            Clinician2PatientGroup.link(clinician, patientGroup)
        }

        def obsoletePatientGroups = oldPatientGroups - newPatientGroups

        obsoletePatientGroups.each {
            Clinician2PatientGroup.unlink(clinician, it)
        }
    }

    def updateRoleLinks(List<Long> roleIds, Clinician clinician) {
        UserRole.removeAll(clinician.user, true)
        Role.findAllByIdInList(roleIds).each { role ->
            def userRole = new UserRole(user: clinician.user, role: role)
            if (!userRole.save()) {
                throw new ClinicianException("clinician.could.not.assign.clinician.rights", userRole.errors)
            }
        }
    }

}

и это мой ClinicianController.grroy, где я также использую `` def clinicianService``` *

import grails.plugin.springsecurity.annotation.Secured
import org.imedcom.server.core.command.CreateClinicianCommand
import org.imedcom.server.model.Clinician
import org.imedcom.server.model.Clinician2PatientGroup
import org.imedcom.server.core.command.ClinicianCommand
import org.imedcom.server.core.model.types.PermissionName
import org.springframework.dao.DataIntegrityViolationException

@Secured(PermissionName.NONE)
class ClinicianController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def clinicianService
    def passwordService
    def springSecurityService
    def authenticationManager

@Secured(PermissionName.CLINICIAN_CREATE)
    def create() {
        if (!params.cleartextPassword) {
            params.cleartextPassword = passwordService.generateTempPassword()
        }
        def command = new CreateClinicianCommand()
        bindData(command, params, ["action", "controller"])

        [cmd: command]
    }

    @Secured(PermissionName.CLINICIAN_CREATE)
    def save(CreateClinicianCommand command) {
        if (!command.validate()) {
            render(view: "create", model: [cmd: command])
            return;
        }

        def clinicianInstance = clinicianService.createClinician(command)
        if (!clinicianInstance.hasErrors()) {
            flash.message = message(code: 'default.created.message', args: [message(code: 'clinician.label'), clinicianInstance.firstName])
            redirect(action: "show", id: clinicianInstance.id)
        } else {
            render(view: "create", model: [cmd: command])
        }
    }

}

и я также использую ClinicianService в других контроллерах. это все было в граальсе 2.4.4.

1 Ответ

0 голосов
/ 01 мая 2020

Если вы хотите вызвать привязку данных из службы Grails, есть несколько способов сделать это. Один из них заключается в реализации DataBinder.

import grails.web.databinding.DataBinder

class SomeService implements DataBinder {

    def serviceMethod(someMap) {
        def obj = new SomeClass()
        bindData obj, params

        obj
    }
}

. Другой вариант - внедрить связыватель данных в ваш сервис:

import org.grails.databinding.SimpleMapDataBindingSource

class SomeService {

    def grailsWebDataBinder

    TestObject getNewTestObject(Map someMap) {
        def obj = new SomeClass()
        grailsWebDataBinder.bind obj, someMap as SimpleMapDataBindingSource
        obj
    }
}
...