2009-12-12 6 views
1

Скажем, у меня есть следующий перехватчик в приложении SEAM:SEAM: Компонент «дезинтегрирован» «слишком рано» в перехватчике?

public class MyInterceptor { 
    @In 
    private Monitor myMonitor; 

    @AroundInvoke 
    public Object aroundInvoke(InvocationContext ctx) throws Exception { 
    try { 
     myMonitor.a(); 
     return ctx.proceed(); 
    } 
    finally { 
     myMonitor.b(); 
    } 
    } 
} 

myMonitor.a() работает (так монитор правильно введен), myMonitor.b() терпит неудачу, потому что монитор уже пустой. Seam Doc гласит: «Введенные значения дезинтегрируются (то есть устанавливаются в нуль) сразу после завершения и исключения метода».

Это то, что происходит? Могу ли я сделать что-то, чтобы сказать SEAM «пока еще» «дезинтегрировать» компонент? Конечно, я могу сделать что-то вроде XContext.get (..), но мне интересно, это ошибка или ошибка с моей стороны. благодаря!

ответ

1

Попробуйте это вместо

Object response = null; 

try { 
    myMonitor.a(); 

    response = ctx.proceed(); 
} finally { 
    myMonitor.b(); 
} 

return response; 

С уважением,

1

Избегайте использования инъекций.

Попробуйте решить эту проблему. Я вижу, что у вас есть какой-то мониторинг. Посмотрите на этот перехватчик, который фиксирует количество времени, которое метод выполняет в компонентах Seam. Попробуйте изменить код, чтобы он соответствовал этому.

Он отлично работает! link

+0

@Shervin Полезно знать (+1), Шервин. Seam Framework: опыт Evolution Java EE говорит, что вы можете избежать @ In-jection с помощью одного метода setter без аннотации @In. –

0

Seam работает как рекламируемый.

Вы можете просто игнорировать disinjection:

public class MyInterceptor { 

    private Monitor myMonitor; 

    @In 
    private void setMonitor(Monitor aMonitor) { 
    if (aMonitor != null) { 
     myMonitor = aMonitor; 
    } 
    } 


    @AroundInvoke 
    public Object aroundInvoke(InvocationContext ctx) throws Exception { 
    try { 
     myMonitor.a(); 
     return ctx.proceed(); 
    } 
    finally { 
     myMonitor.b(); 
     myMonitor = null; //perform disinjection yourself 
    } 
    } 
} 

Оговорки здесь является то, что Шов disinjecting ссылки на причину. Seam хочет контролировать жизненный цикл и личность «myMonitor» и, сохраняя ссылку на него, вы не соблюдаете свой контракт с Seam. Это может привести к неожиданному поведению.

Например, если myMonitor по какой-либо причине находится в области бездействия, Seam может его уничтожить до того, как ctx.proceed() вернется, оставив ссылку со сломанным прокси. Лучший совет - знать масштаб и жизненный цикл того, что вы сохраняете, так как вы «живете на краю».

+0

Хм, извините, но я действительно не понимаю, как ваш код мне поможет. Моя проблема в том, что в строке «myMonitor.b()» myMonitor имеет значение null. (то, что вы описали во втором абзаце, это то, что происходит). Я не вижу, как это «Шов работает как рекламируемый», так как я предполагаю, что «завершение метода» включает в себя выполнение всех finally {} блоков - или я ошибаюсь? – wilth