Как установить и использовать CDI на Tomcat?

Я создаю свой первый проект Java EE 7, но у меня возникли проблемы. Ценю любую помощь.

  • Tomcat 7.0.34
  • JSF 2.2
  • на основе схемы PrimeFaces 3.5
  • javaee-api-7.0.Джар

при запуске приложения в журнале Tomcat отображается следующее сообщение:

"validateJarFile (C:...buildwebWEB-INFlibjavaee-api-7.0.jar)-jar not loaded. See Servlet 2.3 Spec, section 9.7.2. Offending class: javax/servlet/Servlet .class"

когда я нажимаю на кнопку, которая вызывает управляемый Боб, я получаю ошибка:

Advertência: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null
javax.el.PropertyNotFoundException: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null

IndexMB

@Named("indexMB")
@RequestScoped
public class IndexMB {

private String password;
private String user;

public String loginTest(){
    return (this.user.equals("admin") ? "adminPage" : "inOutPage");
}

// getters and setters
}

.в XHTML

<html ...>

<f:loadBundle basename="i18n" var="bundle" />
<h:head>
    <title>#{bundle['index_title']}</title>
</h:head>
<h:body>
    #{bundle['index_appname']}
    <br />
    <h:form id="frmIndex">
        <p:panelGrid columns="2">
            <p:outputLabel for="user" value="#{bundle['lblUser']}" />
            <p:inputText id="user" value="#{indexMB.user}" />

            <p:outputLabel for="password" value="#{bundle['lblPassword']}" />
            <p:password id="password" value="#{indexMB.password}" />
        </p:panelGrid>
        <p:commandButton action="#{indexMB.loginTest}" value="#{bundle['btn_login']}" />
    </h:form> 
</h:body>

faces-config.в XML

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">

<application>
    <locale-config>
        <default-locale>pt_BR</default-locale>
        <supported-locale>en</supported-locale>
        <supported-locale>fr</supported-locale>
    </locale-config>
</application>

эти темы мне не помогли:

2 ответов


Tomcat как контейнер barebones JSP/Servlet не поддерживает CDI из коробки. Как именно вы установили CDI? Вы действительно упали javaee-api.jar на /WEB-INF/lib просто, чтобы получить код для компиляции? О, пожалуйста, Нет, это не правильный путь. Java EE API JAR содержит только классы API, а не конкретную реализацию. Избавься от всей банки. Это может вызвать много других проблем с переносимостью, таких как описанные в этом ответе: как импортировать javax.API сервлета в my Проект Eclipse? вы должны фактически устанавливать конкретную реализацию вместе с конкретным API.

у вас есть 2 варианта:

  1. отбросьте Tomcat и перейдите к истинному контейнеру Java EE. Поскольку вы используете Tomcat, просто перейдите к TomEE. Это очень просто,загрузите zip-файл веб-профиля TomEE, извлечь его и интегрировать его в Eclipse точно так же, как вы сделали для Tomcat. Не забудьте удалить файл Java EE JAR из webapp и изменить Целевая Среда Выполнения свойство в свойствах проекта от Tomcat до TomEE, чтобы зависимости Java EE были правильно разрешены.

    никакие дополнительные Опарникы или конфигурация не необходимы. Вы даже можете удалить банки JSF из своего webapp. TomEE как истинный контейнер Java EE уже предоставляет среди других JSF и CDI из коробки. Если вы используете Maven, приведенная ниже координата достаточный.

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version><!-- 8.0 or 7.0 or 6.0 --></version>
        <scope>provided</scope>
    </dependency>
    

    отмечаем важность provided и его значение, как в "целевой среде выполнения уже предоставляет это поле". См. также как правильно установить и настроить библиотеки JSF через Maven?.


  2. установите истинную реализацию CDI на Tomcat. сварка является одной из доступных реализаций CDI. В руководство по установке сварного шва вы можете найти инструкции как интегрировать его в Tomcat. Для полноты и дальнейшего использования, вот шаги:

    1. падение weld-servlet-shaded.jar в webapp /WEB-INF/lib. Если вы используете Maven, используйте эта координата:

      <dependency>
          <groupId>org.jboss.weld.servlet</groupId>
          <artifactId>weld-servlet-shaded</artifactId>
          <version>3.0.5.Final</version>
      </dependency>
      
    2. создать /META-INF/context.xml файл в webapp со следующим содержимым:

      <Context>
          <Resource name="BeanManager" 
              auth="Container"
              type="javax.enterprise.inject.spi.BeanManager"
              factory="org.jboss.weld.resources.ManagerObjectFactory"/>
      </Context>
      

      обратите внимание, что этот шаг не является строго необходимым, когда вы используете Mojarra 2.2.11 или новее, как она сможет найти его через ServletContext при отсутствии в JNDI.

    3. создать пустой /WEB-INF/beans.xml файл в webapp.

    вот и все (примечание: в старых версиях сервлета сварки вам нужно будет явно зарегистрировать диспетчер компонентов CDI и прослушиватель сварки в web.xml тоже, но это не нужно с текущими версиями).

    если вы предпочитаете OpenWebBeans выше сварки в качестве реализации CDI, перейдите в этот блог для получения подробных инструкций по установке Maven:как установить CDI в Tomcat?


связаны к конкретной проблеме, API JSP / Servlet Tomcat 7 do не соответствуют тем API Java EE 7, вместо этого он соответствует Java EE 6 (сервлет 3.0 / JSP 2.2). Если вы хотите эквивалент Tomcat Java EE 7 (сервлет 3.1 / JSP 2.3), то вы должны смотреть на Tomcat 8. См. также матрица версий Apache Tomcat.


другой возможный вариант оставляет beans.xml в развертывании.