2013-09-25 4 views
25

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

  • Tomcat 7.0.34
  • JSF 2.2
  • Primefaces 3.5
  • JavaEE-апи-7.0.jar

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

"validateJarFile (C:\...\build\web\WEB-INF\lib\javaee-api-7.0.jar)-jar not loaded. See Servlet 2.3 Spec, section 9.7.2. Offending class: javax/servlet/Servlet .class" 

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

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 
} 

index.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> 

лица-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> 

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

+1

Показать файл 'faces-config.xml' – Yubaraj

+0

Спасибо @ Kalathoki, добавлен файл. Почти ничего, потому что я использую аннотации. –

+0

убедитесь, что бит 'indexMB' успешно создан. – erencan

ответ

49

Tomcat как баребоны JSP/контейнер сервлетов не поддерживает CDI из коробки. Как именно вы установили CDI? Вы действительно потеряли javaee-api-7.0.jar в /WEB-INF/lib, чтобы получить код для компиляции? О, пожалуйста, нет, это не правильный путь. Java JE API JAR содержит только классы API, а не конкретную реализацию. Избавьтесь от всего JAR. Это может вызвать многие другие проблемы с переносимостью, подобные тем, которые описаны в этом ответе: How do I import the javax.servlet API in my Eclipse project? Фактически вы должны установить конкретную реализацию вместе с конкретным API.

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

  1. падения Tomcat и пойти на истинный контейнер Java EE. Когда вы используете Tomcat, просто перейдите к TomEE. Это очень просто, download the TomEE web profile zip file, извлеките его и интегрируйте в Eclipse точно так же, как и для Tomcat. Не забудьте удалить файл Java EE JAR из webapp и изменить свойство Targeted Runtime в свойствах проекта от Tomcat до TomEE, чтобы соответствующие зависимости Java EE были разрешены.

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

    <dependency> 
        <groupId>javax</groupId> 
        <artifactId>javaee-web-api</artifactId> 
        <version><!-- 7.0 (TomEE 7.x) or 6.0 (TomEE 1.x) --></version> 
        <scope>provided</scope> 
    </dependency> 
    

    Обратите внимание на важность provided и его значение, как и в «цель выполнения уже обеспечивает это из коробки». См. Также our JSF wiki page.


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

    1. капля в WebApp-х /WEB-INF/libweld-servlet-shaded.jar. В случае, если вы используете Maven, используйте this coordinate:

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

      <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.

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

    В случае, если вы предпочитаете OpenWebBeans выше Weld как реализация КДИ, главы в этом блоге подробные инструкции по установке Maven: How to install CDI in Tomcat?


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

+0

Как я уже сказал, «это мой первый проект Java EE 7». Большое спасибо. –

+0

Добро пожаловать. – BalusC

+0

Я переключился на TomEE, но для его инициализации отображается следующая ошибка: 'com.sun.faces.config.ConfigurationException: Factory 'javax.faces.application.ApplicationFactory' не настроен должным образом.« Я видел тему [не мог найти Заводская: javax.faces.context.FacesContextFactory] (http: // stackoverflow.com/questions/7886035/could-not-find-factory-javax-faces-context-facescontextfactory), но это не помогло. Любые комментарии? –

0

Другая возможная опция - оставить beans.xml в вашем развертывании.

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