@PostConstruct Interceptor с @Named @ViewScoped не вызывается

Я внимательно прочитал статью о перехватчиках в документации по шву/сварке и реализовал InterceptorBinding:

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyLog {}

и класс Interceptor:

@MyLog @Interceptor
public class ErpLogInterceptor implements Serializable
{
  @AroundInvoke
  public Object logMethodEntry(InvocationContext invocationContext) throws Exception
  {..}

  @PostConstruct
  public Object logPostConstruct(InvocationContext invocationContext) throws Exception
  {...}
}

Нет, я пытался активировать перехватчик в бине @Named @ViewScoped:

@javax.inject.Named;
@javax.faces.bean.ViewScoped
public class MyBean implements Serializable
{
  @PostConstruct @MyLog
  public void init()
  {...}

  @MyLog public void toggleButton()
  {..}
}

Если я нажимаю кнопку на своей странице JSF, метод toggleButton вызывается правильно, и вызывается метод Interceptor logMethodEntry. Но похоже, что метод @PostConstruct (который меня интересует) никогда не перехватывается моим классом.

Вопрос, похоже, связан с перехватчиками Java EE и bean-компонентом @ViewScoped, но на самом деле мой перехватчик работает нормально методы.


person Thor    schedule 08.11.2012    source источник
comment
Используете ли вы CODI, как указано в ответе на связанный вопрос? @ViewScoped, специфичный для JSF, иначе просто не работает в @Named, специфичный для CDI.   -  person BalusC    schedule 08.11.2012
comment
Вы уверены, что перехватчики работают для методов жизненного цикла?   -  person Adrian Mitev    schedule 09.11.2012
comment
@AdrianMitev: По крайней мере, эти перехватчики описаны в документе, на который я ссылаюсь.   -  person Thor    schedule 09.11.2012
comment
Что произойдет, если вы используете область CDI вместо области JSF (да, я знаю, что Seam 3 меняет ее, но может быть что-то с перехватчиками, которые она не делает)?   -  person LightGuard    schedule 09.11.2012
comment
@LightGuard: область действия изменена на @javax.enterprise.context.SessionScoped, но ничего в течение @PostConstruct   -  person Thor    schedule 09.11.2012
comment
Похоже, это, вероятно, ошибка, однако мы больше не работаем над швом 3.   -  person LightGuard    schedule 10.11.2012
comment
@LightGuard: я знаю, что вы активно участвуете в Seam3, и этот вопрос, скорее всего, не по теме, но что именно вы имеете в виду, говоря, что мы больше не работаем над Seam 3? Можете указать URL?   -  person Thor    schedule 10.11.2012
comment
Последним релизом был 3.1.0.Final почти год назад. Мы вкладываем наши усилия в Apache DeltaSpike.   -  person LightGuard    schedule 10.11.2012


Ответы (1)


Вы должны установить возвращаемый тип перехватчика @PostConstruct на void, а не на Object. Изменять:

  @PostConstruct
  public Object logPostConstruct(InvocationContext invocationContext) throws Exception
  {...}

to:

  @PostConstruct
  public void logPostConstruct(InvocationContext invocationContext) throws Exception
  {...}
person A.Panzer    schedule 04.09.2015