#java #grails #upgrade
#java #граали #Обновление #grails
Вопрос:
Я обновил свое приложение с grails 2.5 до grails 3.3.11. Я выполнил все шаги, и, кажется, все в порядке, но когда я запускаю приложение. У меня возникла эта ошибка :
сбой при запуске: /home/server-dev/Documents/dev_repo/tms/grails-app/controllers/org/niport/auth/AuthRoleController.groovy : -1: возвращаемый тип java.lang.Логическое значение hasErrors() в org.niport.auth.AuthRoleController несовместим с boolean в grails.артефакт.Контроллер . В [-1:-1] @ строка -1, столбец -1. ошибка 1
СБОЙ: сбой сборки с исключением.
- Что пошло не так: не удалось выполнить задачу ‘:compileGroovy’.
Сбой компиляции; подробности см. В выводе ошибки компилятора.
Любая идея или помощь будут полезны, большое спасибо
————————AuthUserController.заводной ———————
import grails.plugin.springsecurity.SpringSecurityService
import grails.transaction.Transactional
import org.niport.com.ComTrainingCenter
import org.niport.com.ComTrainingCenterService
import org.niport.com.FileService
import org.niport.com.TrackerService
import org.springframework.security.core.context.SecurityContextHolder
import javax.imageio.ImageIO
import java.awt.image.BufferedImage
import static org.springframework.http.HttpStatus.CREATED
import static org.springframework.http.HttpStatus.OK
@Transactional(readOnly = true)
class AuthUserController {
private static final allowedImageType = ['image/png', 'image/jpeg']
SpringSecurityService springSecurityService
AuthUserService authUserService
TrackerService trackerService
FileService fileService
def dateParseFormat,
currentDate
AuthUser currentUser
@Transactional
save(AuthUser userInstance) {
if (userInstance == null) {
flash.error = message(code: "default.message.noRecordFound.label", default: "Error-Save-AuthUser-L21 : Record not found...!")
redirect(action: "create")
return
}
userInstance.avatarType = params.attachment ? fileService.uploadFile("auth", "auth_user", userInstance?.username, "any", 1, 5000000, params.attachment) : null
userInstance.createdBy = currentUser?.id
userInstance.properties["hdCode"] = trackerService.getHdCode(params.password)
userInstance.validate()
if (userInstance.hasErrors()) {
flash.error = "Error-Save-AuthUser-L27 : " userInstance.errors
redirect(action: "create", userInstance: userInstance)
return
}
try {
userInstance.save(failOnError: true)
}
catch (Exception e) {
println "ex-user-sa-L112 : " e
flash.error = "Error-Save-AuthUser-L113 : " e
redirect(action: "create", userInstance: userInstance)
return
}
request.withFormat {
form multipartForm {
flash.success = message(code: "default.message.created", args: [message(code: "user.pageTitle.label", default: "AuthUser"), userInstance.id])
redirect userInstance
}
'*' { respond userInstance, [status: CREATED] }
}
}}
--------------------------AuthRoleController.groovy ----------------------
mport grails.transaction.Transactional
import grails.validation.Validateable
//import grails.artefact.Controller
//import java.lang.*
import static org.springframework.http.HttpStatus.CREATED
import static org.springframework.http.HttpStatus.OK
class AuthRoleController implements Validateable {
static allowedMethods = [save: "POST", update: "PUT"]
def springSecurityService, dateFormat, currentDate, currentUser
def beforeInterceptor = {
currentDate = new Date()
currentUser = springSecurityService.getCurrentUser()
dateFormat = grailsApplication.config.format.dtp.date
}
@Transactional
def save(AuthRole roleInstance) {
roleInstance.createdBy=(AuthUser)currentUser
roleInstance.validate()
if (roleInstance == null) {
flash.error = message(code: "default.message.noRecordFound.label", default: "Error-Save-AuthRole-L21 : Record not found...!")
redirect(action: "create")
return
}
log.info "${roleInstance}";
if (roleInstance.hasErrors()) {
flash.error = "Error-Save-AuthRole-L27 : " roleInstance.errors
redirect(action: "create", roleInstance: roleInstance)
return
}
try {
roleInstance.save failOnError: true
}
catch (Exception e) {
flash.error = "Error-Save-AuthRole-L36 : " e
redirect(action: "create", roleInstance: roleInstance)
return
}
request.withFormat {
form multipartForm {
flash.success = message(code: "default.message.created", args: [message(code: "role.pageTitle.label", default: "AuthRole"), roleInstance.id])
redirect roleInstance
}
'*' { respond roleInstance, [status: CREATED] }
}
}
}
}
Комментарии:
1. Есть ли
org.niport.auth.AuthRoleController
в нем метод с именемhasErrors
? Если нет, то расширяет ли контроллер явно какой-либо класс или реализует какие-либо черты?2. Привет @JeffScottBrown это всего лишь экземпляр взаимодействия с ошибкой Spring, связанного с контроллером. Но я могу поделиться кодом связанных элементов управления в качестве ответов
3. Это не связано с вашим вопросом, но добавленный вами код указывает на другую проблему, и это ваш контроллер не будет совместим с параллельными запросами из-за способа, которым вы передаете
currentUser
AuthRoleController
. Это будет нарушено, если вы не настроите свои контроллеры на область запроса, что является плохой идеей.
Ответ №1:
класс AuthRoleController реализует Проверяемый
Нет веских причин для того, чтобы контроллер реализовывал эту Validateable
черту, и это вызовет проблемы.
Проблема в том, что вы собираетесь получить 2 названных метода hasErrors
, один из https://github.com/grails/grails-core/blob/1979b62d0ef9ebbaa547c8744263376557a10459/grails-plugin-validation/src/main/groovy/grails/validation/Validateable.groovy#L58 и один из https://github.com/grails/grails-core/blob/1979b62d0ef9ebbaa547c8744263376557a10459/grails-plugin-controllers/src/main/groovy/grails/artefact/Controller.groovy#L123 , и они имеют разные типы возвращаемых данных.
Комментарии:
1. Удаление
Validateable
из контроллера не будет стоить вам никаких возможностей. Его присутствие не приносит ничего полезного.2. Спасибо, Джефф, я удалю Проверяемый интерфейс и сообщу вам сейчас, если он сработает