2010-06-09 2 views
2

Я создал простой сервлет в приложении seam-gen (2.1.2), теперь я бы хотел использовать инъекцию. Таким образом, я аннотированный его @name, и это признано в качестве компонента:Может ли простой сервлет быть настроен как компонент шва?

 INFO [Component] Component: ConfigReport, 
scope: EVENT, type: JAVA_BEAN, class: com.mycompany.servlet.ConfigReport 

Unfortunatly инъекция регистратора не работает NullPointerException в init()

import org.jboss.seam.annotations.Logger; 
import org.jboss.seam.annotations.Name; 
import org.jboss.seam.log.Log; 

@Name("ConfigReport") 
public class ConfigReport extends HttpServlet { 

    @Logger 
    private Log log; 

    public void init(ServletConfig config) throws ServletException { 
     log.info("BOOM"); 
    } 

}

Является ли мой подход оскорбительным?
Какими будут альтернативы (клиент, отправляющий запросы сервлету, является завитки, а не браузером)?

ответ

3

Штабелер, если вы хотите, чтобы Seam @ In-ject активировал компонент, Он должен перехватить ваш запрос. Например, @ In-ject работает при использовании EJB, потому что Seam использует перехватчик EJB. Это объясняет, почему вы должны объявить перехватчик Sej EJB при использовании EJB.

Java Server Faces, в другой стороны, Seam использует Expression Language распознаватель, чтобы дать вам доступ к любому компоненту Шов, который устанавливается по умолчанию при Шов основной сосуд помещают на пути к классам.

Ключ для того, чтобы Seam интеграцию с любой веб-технологии является ContextFilter - Помните, вы должны включить Seam фильтр использовать ContextFilter - который описан в соответствии с Seam в книге действий следующим образом

Позволяет Seam контейнер и контексты для запросов, не связанных с JSF. Не следует применять к запросам JSF, поскольку это приводит к дублированию логики, что приводит к неопределенным результатам.

...

ContextFilter открывает доступ к шву контейнера и контекстных переменных нерезиденту-JSF сервлетов, таких как Struts, Spring MVC, и Direct Web Remoting (DWR). Хотя большая часть работы Seam выполняется в сервлете JSF, эти дополнительные фильтры позволяют Seam до расширить границы своего жизненного цикла выше и за пределами сервлета JSF.

Чтобы включить ContextFilter вы объявляете его в components.xml

<component name="org.jboss.seam.web.contextFilter"> 
    <property name="disabled">false</property> 
</component> 

Потому что нет свободного времени, я не знаю, как использовать этот вид funcionality. Взгляните на исходный код ContextFilter. Это может дать вам хорошее представление.

+0

+ Спасибо, только что купил эту книгу несколько дней назад, и вы дали мне указатели – stacker

6

Для записей:

Помимо важных подсказок артур-Ronald-е-д-Garcia дал.

Впрыск компонентов по-прежнему не работает, по крайней мере, я могу найти компоненты вручную, поэтому необходим контекст ContextualHttpServletRequest.

Компоненты.XML

<web:context-filter regex-url-pattern="/config/*"/> 

servlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     final HttpServletRequest req = request; 
     final HttpServletResponse res = response; 
     new ContextualHttpServletRequest(req) { 
       public void process() throws Exception { 
        wrappedGet(req, res); 
       } 
       }.run(); 
    } 

В обернутой коде сервлета

entityManager = (EntityManager) Component.getInstance("entityManager"); 

Ссылки:

+0

Спасибо. Хорошая работа (+1). Я притворяюсь, что использую ContextFilter с другими веб-платформами. –

Смежные вопросы