Можно ли настроить простой сервлет в качестве компонента шва? - PullRequest
2 голосов
/ 09 июня 2010

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

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

К сожалению, инъекция регистратора не работает 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" );
    }

}

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

Ответы [ 2 ]

6 голосов
/ 10 июня 2010

Для записей:

Помимо важных советов, которые давал Артур-Рональд-Ф-Д-Гарсия.

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

components.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" );

Ссылки:

3 голосов
/ 09 июня 2010

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

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

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

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

...

ContextFilter открывает доступ к контейнеру Seam и его контекстным переменным для не-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>

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

...