Конструктор Enum вызывает ara, допустимый только внутри класса enum - PullRequest
2 голосов
/ 14 марта 2012

Я работаю над проектом Grails. Сейчас у меня очень тревожная проблема. У меня есть enum с именем Status вроде этого:

enum Status {

    ENABLED("Habilitado"), DISABLED ("Desabilitado")

    String type

    private Status(String type) {
        this.type = type
    }

    def String toString() {
        return this.type
    }

    static list() {
        [ENABLED, DISABLED]
    }
}

У меня также есть контроллер под названием TesterController, где я постоянно получаю сообщения о том, что «вызовы конструктора Enum разрешены только внутри класса enum». Дело в том, что я не вызываю конструктор enum из класса контроллера! Вот оно:

class TesterController {

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

    def index() {
        redirect(action: "list", params: params)
    }

    def list() {
        def minElems = 10

        if(params.max) minElems = params.int('max')

        params.max = Math.min(minElems, 100)

        [testers: Tester.list(params), testerTotal: Tester.count()]
    }

    def create() {
        [tester: new Tester(params)]
    }

    def save() {
        def tester = new Tester(params)
        if (!tester.save(flush: true)) {
            render(view: "create", model: [tester: tester])
            return
        }

        flash.message = message(code: 'ateweb.created.message', args: [tester.name])
        redirect(action: "show", id: tester.id)
    }

    def show() {
        def tester = Tester.get(params.id)
        if (!tester) {
            flash.message = message(code: 'ateweb.not.found.message', args: [message(code: 'tester.label', default: 'Tester'), params.name])
            redirect(action: "list")
            return
        }

        [tester: tester]
    }

    def edit() {
        def tester = Tester.get(params.id)
        if (!tester) {
            flash.message = message(code: 'ateweb.not.found.message', args: [message(code: 'tester.label', default: 'Tester'), params.name])
            redirect(action: "list")
            return
        }

        [tester: tester]
    }

    def update() {
        def tester = Tester.get(params.id)
        if (!tester) {
            flash.message = message(code: 'ateweb.not.found.message', args: [message(code: 'tester.label', default: 'Tester'), params.name])
            redirect(action: "list")
            return
        }

        if (params.version) {
            def version = params.version.toLong()
            if (tester.version > version) {
                tester.errors.rejectValue("version", "ateweb.optimistic.locking.failure",
                      [message(code: 'tester.label', default: 'Tester')] as Object[],
                      "Another user has updated this Tester while you were editing")
                render(view: "edit", model: [tester: tester])
                return
            }
        }

        tester.properties = params

        if (!tester.save(flush: true)) {
            render(view: "edit", model: [tester: tester])
            return
        }

        flash.message = message(code: 'ateweb.updated.message', args: [tester.name])
        redirect(action: "show", id: tester.id)
    }
}

Хорошо. Так что я потерян с этим. Любая помощь приветствуется.

1 Ответ

1 голос
/ 15 марта 2012

Есть несколько проблем с определением вашего Status класса, хотя я не знаю, являются ли они причиной вашей проблемы

enum Status {

    ENABLED("Habilitado"), DISABLED ("Desabilitado")

    String type

    // delcaring the constructor private doesn't make much sense because
    // enum constuctors can never be called outside the class
    private Status(String type) {
        this.type = type
    }

    // return type is declared as both def (Object) and String
    def String toString() {
        return this.type
    }

    // this is identical to the automatically-generated values() method
    static list() {
        [ENABLED, DISABLED]
    }
}

Переопределите этот класс как

enum Status {

    ENABLED("Habilitado"), DISABLED ("Desabilitado")

    String type

    Status(String type) {
        this.type = type
    }

    String toString() {
        return this.type
    }
}

и используйте values() вместо удаленного list() метода, и, возможно, ваша проблема исчезнет

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