Как запустить Weld 3.0 cid setParameterName в Tomcat 8.5 / Servlet 3.1 - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь обновить старое веб-приложение с 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?

1 Ответ

1 голос
/ 20 мая 2019

Инициализация 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-приложения 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());
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...