GroovyDynamicMethodsInterceptor

GroovyDynamicMethodsInterceptor

是否可以在 grails 3.0.17 中使用 GroovyDynamicMethodsInterceptor。 如果没有,我可以用什么代替?

这是我的代码的一部分 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])
        }
    }

}

我也在其他控制器中使用临床医生服务。 这一切都在 grails 2.4.4.

如果您想从 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
    }
}