2016-04-07 4 views
1

Глядя на Grails 3 documentation следующее написано о прицелах:Grails 3 Контроллер Сфера

прототипа (по умолчанию) - новый контроллер будет создан для каждого запроса (рекомендуется для действий в качестве свойств Closure)

нечетная часть здесь является то, что я получаю значительно различающиеся результаты в Grails 3.1.4, если я явно состояние:

static scope = "prototype" 

Tak е, например, следующие UserController

class UserController { 
    def userService 
    List<String> users 

    def loadUsers() { 
     if (!users) { 
      println("########## have to load users"); 
      try { 
       user = userService.getAllUsersInAd() 
      } catch (Exception e) { 
       // do something 
      } 
     } else { 
      println("########## dont have to do it " + users.size()); 
     } 
    } 
} 

А следующий UserService

class UserService { 
    def getAllUsersInAd() { 
     println("######### querying") 
     return new ArrayList<String>(); 
    } 
} 

Если статическая область видимости опущено:

Когда я закрываю браузер Firefox и повторно открыть его, «не должны это выполняется », независимо от того, сколько раз я закрываю/открываю его снова. Что еще более странно в том, что я могу открыть совершенно другой браузер (например, хром), когда я закрываю Firefox, и это же сообщение выполняется. Это почти так, как будто объем этого контроллера аналогичен области применения @ApplicationScope JSF. После хорошего 5-10 минут простоя запрос выполняется снова, но сценарий остается.

Если статическая область видимости указано:

После каждого закрытия браузера, «должны загрузить пользователей» выполняется, как ожидалось.

Вопрос в том, является ли документация неправильной для области по умолчанию? Если это не так, то в чем разница между явным заявлением scope = "prototype" и отсутствием его (помимо очевидного выше)?

ответ

3

В умолчанию генерируется файл application.yml для Grails 3.1.4 приложения, которое вы должны увидеть настройки как это:

grails: 
    controllers: 
     defaultScope: singleton 

Это говорит рамки, чтобы сделать контроллеры одиночки. По умолчанию используется значение prototype, если эта настройка не установлена.

+0

Если ваша настройка конфигурации такова, как описано выше, ваши контроллеры будут областью «singleton», если у вас нет «static scope = ...» в контроллере. Это объясняет, почему вы видите другое поведение, когда в вашем контроллере есть «static scope =« прототип ». –

1

Да, я считаю, что контроллеры по умолчанию были изменены в область Singleton (application) по умолчанию некоторое время назад (версия 1.4.x, как это бывает). Я пытаюсь найти документацию об этом. Кажется, это было исправление проблемы JIRA, первоначально here, но Grails отошел от JIRA и не переместил все ошибки в GitHub.

Вы не должны иметь состояние контроллеров в любом случае по команде Grails: ответ Why does Grails recommend singleton scope for controllers with actions as methods? знакомства Берта, и Джефф даже говорит в комментариях.

EDIT: По словам Джеффа, по умолчанию все еще прототип, но созданная по умолчанию конфигурация изменяет их все на одиночный, что рекомендуется.

+1

«Я считаю, что контроллеры по умолчанию были изменены до однопользовательской (прикладной) области». Это не совсем так. Мы изменили ситуацию так, чтобы созданная по умолчанию конфигурация установила область действия в одноэлементную, но фактическое значение по умолчанию все еще является прототипом. В 3.1.4, который наложен на https://github.com/grails/grails-core/blob/e402f3fa32f84c1b816e97db893158606517f89e/grails-core/src/main/groovy/org/grails/core/DefaultGrailsControllerClass.java#L80. –

+0

Спасибо, Джефф. Я предполагаю, что 2.x имеет другую конфигурацию, также установленную на singleton. – billjamesdev

+0

«Я предполагаю, что 2.x имеет другую конфигурацию, также установленную в singleton». - Оно делает. По умолчанию это «прототип» в обоих случаях, а параметр конфигурации переопределяет это. –

 Смежные вопросы

  • Нет связанных вопросов^_^