Как запустить Weld 3.0 cid setParameterName на Tomcat 8.5/Servlet 3.1

Я пытаюсь обновить старое веб-приложение с JSF 2.1.1-FCS до 2.2.14, работающее в контейнере Tomcat 8.5 Servlet 3.1.

Минимальные требования Mojarra JSF (для последней версии, я думаю, страница не кажется ясной) говорят, среди прочего, что требуется CDI 1.2 с рекомендуемой версией 2.0.

Я добавил cd-api-2.0 и weld-servlet-shaded-3.0.0.Final вместе с другими зависимостями. Кажется, все работает, пока я не протестирую некоторые URL-адреса, которые мы использовали долгое время. Наше приложение использует параметр cid. Weld использует тот же параметр для отслеживания разговоров. В результате получаем ошибку WELD-000321: No conversation found to restore for id.

Я хотел бы вызвать org.jboss.weld.context.http.HttpConversationContext.setParameterName(String cid) как можно раньше, чтобы изменить значение для этого веб-приложения.

Каков наилучший способ изменить это значение в контексте контейнера Servlet 3.1, например, в Tomcat 8.5?


person jla    schedule 16.05.2019    source источник
comment
Вы вызываете этот метод «вручную» из исходного кода? Вы перешли на аннотации CDI?   -  person Selaron    schedule 17.05.2019
comment
Вы можете настроить параметр сварки iirc   -  person Kukeltje    schedule 17.05.2019
comment
@Selaron, я пытался внедрить HttpConversationContext для вызова setParameterName из нескольких разных мест, подобно тому, что показано в этом ответе: stackoverflow .com/a/26744986/101151, но, похоже, он не был внедрен. Я не уверен, когда подходящее время, чтобы подключиться к нему. В сервлете кажется слишком поздно.   -  person jla    schedule 20.05.2019
comment
@Kukeltje Я вернулся и снова посмотрел параметр по вашему предложению. Похоже, это WELD_CONTEXT_ID_KEY. Отлично работает, спасибо! Я не знаю, пропустил ли я это, потому что слишком усердно искал org.jboss.weld... или потому, что то, как они описывают его в средах, не соответствовало моему варианту использования и ошибке. Отчет об ошибке WELD-1697 сделал.   -  person jla    schedule 20.05.2019
comment
Круто, пожалуйста, создайте ответ, если вы не можете найти дубликат в stackoverflow.   -  person Kukeltje    schedule 20.05.2019


Ответы (1)


Инициализировать WELD_CONTEXT_ID_KEY в файле web.xml

Использование контекстного параметра web.xml WELD_CONTEXT_ID_KEY позволило мне переопределить имя ключа параметра диалога Weld CDI с cid на значение по моему выбору, чтобы я мог сохранить устаревшее использование cid в моем обновленном приложении и избежать ошибки WELD-000321.

<context-param>
    <param-name>WELD_CONTEXT_ID_KEY</param-name>
    <param-value>customValue</param-value>
</context-param>

Это было самое простое решение, но я не установил связь между этим именем параметра контекста и ключом параметра диалога или ошибкой WELD-000321 при первом чтении документация по сварке.

Или установить программно

Я также смог программно переопределить ключ имени параметра/идентификатора контекста из пользовательского метода ServletContextListener.contextInitialized на основе примера SO для избавления от исключение NonexistentConversationException. Поскольку я работаю на Tomcat 8.5 (Servlet 3.1), я смог использовать либо @WebListener, либо элемент listener в web.xml. Казалось, не имело значения, была ли моя версия веб-приложения web.xml старой 2.5 или я обновил ее до 3.1.

package ssce;

import java.util.UUID;
import javax.inject.Inject;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.jboss.weld.context.http.HttpConversationContext;

@WebListener
public class MyServletContextListener implements ServletContextListener {

    @Inject
    private HttpConversationContext conversationContext;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        hideConversationScope();
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }


    /**
     * "Hide" conversation scope by replacing its default "cid" parameter name
     * by something unpredictable.
     */
    private void hideConversationScope() {
        conversationContext.setParameterName(UUID.randomUUID().toString());
    }

}
person jla    schedule 20.05.2019