@PostConstruct Interceptor dengan @Named @ViewScoped tidak dipanggil

Saya telah membaca dengan cermat artikel tentang Interceptors dalam dokumentasi Seam/Weld dan menerapkan InterceptorBinding:

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

dan kelas Interceptor:

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

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

Tidak, saya mencoba mengaktifkan interseptor di kacang @Named @ViewScoped:

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

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

Jika saya menekan tombol di halaman JSF saya, metode toggleButton dipanggil dengan benar dan metode Interceptor logMethodEntry dipanggil. Tapi sepertinya metode @PostConstruct (saya tertarik) tidak pernah dicegat oleh kelas saya.

Pertanyaannya sepertinya terkait dengan Java EE Interceptors dan @ViewScoped bean tetapi sebenarnya interseptor saya berfungsi normal metode.


person Thor    schedule 08.11.2012    source sumber
comment
Apakah Anda menggunakan CODI sebagaimana diuraikan dalam jawaban pertanyaan terkait? @ViewScoped khusus JSF jika tidak, tidak akan berfungsi di @Named khusus CDI.   -  person BalusC    schedule 08.11.2012
comment
Apakah Anda yakin pencegat berfungsi untuk metode siklus hidup?   -  person Adrian Mitev    schedule 09.11.2012
comment
@AdrianMitev: Setidaknya pencegat ini dijelaskan dalam dokumen yang saya referensikan.   -  person Thor    schedule 09.11.2012
comment
Apa yang terjadi jika Anda menggunakan cakupan CDI dan bukan cakupan JSF (ya, saya tahu Seam 3 mengubahnya, tetapi mungkin ada sesuatu dengan pencegat yang tidak dilakukannya)?   -  person LightGuard    schedule 09.11.2012
comment
@LightGuard: Mengubah cakupan menjadi @javax.enterprise.context.SessionScoped, tetapi tidak melakukan apa pun selama @PostConstruct   -  person Thor    schedule 09.11.2012
comment
Sepertinya ini bug, namun kami tidak lagi mengerjakan Seam 3.   -  person LightGuard    schedule 10.11.2012
comment
@LightGuard: Saya tahu Anda sangat terlibat dalam Seam3, dan pertanyaan ini kemungkinan besar di luar topik, tapi apa sebenarnya yang Anda maksud dengan kami tidak lagi mengerjakan Seam 3? Bisakah Anda menunjuk ke URL?   -  person Thor    schedule 10.11.2012
comment
Rilis terakhir adalah 3.1.0.Final hampir setahun yang lalu. Kami berupaya keras pada Apache DeltaSpike.   -  person LightGuard    schedule 10.11.2012


Jawaban (1)


Anda harus menyetel tipe pengembalian @PostConstruct pencegat ke void bukan Object. Mengubah:

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

to:

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