@PostConstruct Interceptor ด้วย @Named @ViewScoped ไม่ได้ถูกเรียกใช้

ฉันได้อ่านบทความเกี่ยวกับ Interceptors ในเอกสารตะเข็บ/การเชื่อม และใช้งาน 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
  {...}
}

ไม่ ฉันพยายามเปิดใช้งาน Interceptor ใน @Named @ViewScoped bean:

@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 Interceptors และ @ViewScoped bean แต่จริงๆ แล้ว Interceptors ของฉันทำงานใน ปกติ วิธีการ


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: อย่างน้อย interceptors เหล่านี้ได้อธิบายไว้ในเอกสารที่ฉันอ้างอิง   -  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
ฟังดูน่าจะเป็นจุดบกพร่อง แต่เราไม่ได้ทำงานกับ Seam 3 อีกต่อไป   -  person LightGuard    schedule 10.11.2012
comment
@LightGuard: ฉันรู้ว่าคุณมีส่วนร่วมอย่างมากใน Seam3 และคำถามนี้น่าจะนอกประเด็น แต่คุณหมายถึงอะไรกันแน่ที่เราไม่ได้ทำงานกับ Seam 3 อีกต่อไป คุณสามารถชี้ไปที่ URL ได้หรือไม่?   -  person Thor    schedule 10.11.2012
comment
รุ่นล่าสุดคือ 3.1.0 สุดท้ายเมื่อเกือบหนึ่งปีที่แล้ว เรากำลังทุ่มเทความพยายามกับ Apache DeltaSpike   -  person LightGuard    schedule 10.11.2012


คำตอบ (1)


คุณควรตั้งค่าประเภทการส่งคืนของ @PostConstruct interceptor เป็น 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