Работают ли несколько методов @Before в наследовании контроллера? - PullRequest
3 голосов
/ 19 ноября 2011

Я пытаюсь сделать что-то похожее на это, и вызывается только один из методов @Before:

public abstract class ControllerBase extends Controller {
  @Before
  static void foo() {
    // this actually gets called
  }
}

public class ConcreteController extends ControllerBase {
  @Before
  static void bar() {
    // This DOES NOT get called
  }

  public static void index() {
    render();
  }
}

Это ошибка, функция или что-то не так?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Вы пытаетесь сделать что-то странное. И я думаю, что ваш пример не соответствует вашему вопросу. Вы хотели реализовать ConcreteController в ControllerBase? Вместо того, чтобы оба они распространялись на Controller?

Тег @before является тегом конкретного класса. Только тот в конкретном классе будет выполнен.

Вы можете @ переопределить исходную функцию, но я не думаю, что это то, что вы искали.

Лучший способ получить то, что вы хотите, это удалить @before из аннотации и вызвать из конкретной функции реализованную функцию, которую вы хотите запустить.

public abstract class ControllerBase extends Controller {
  static void foo() {
    // this actually gets called
  }
}

public static class ConcreteController extends Controller {
  @Before
  static void bar() {
    foo();
    // This DOES NOT get called
  }

  public static void index() {
    render();
  }
}
0 голосов
/ 20 ноября 2011

Да, играй!вызовет все методы в иерархии наследования, помеченные @Before.

Проблема, с которой я столкнулся, заключалась в том, что @Before, который я использовал, был на самом деле org.junit.Before вместо play.mvc.Before!

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