2014-02-12 4 views
0

Я где-то читал, что лучше использовать CDI @Named вместо JSF @ManagedBean, из-за CDI, поэтому я пытаюсь преобразовать часть своего кода. Я пытаюсь использовать @Named в JSF, но это всегда недостижимо. При использовании @ManagedBean проблем не возникло.Как сформировать @Named Backing Bean в JSF

Я использую его как @ManagedBean, как показано ниже

CustomerBacking.java

package com.wordpress.marczykm.backing; 

import javax.ejb.EJB; 
import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 

@Named("customer") 
@RequestScoped 
public class CustomerBacking { 

    @EJB 
    private CustomerService customerService; 

    public CustomerBacking() { 
    } 

    public String addCustomer(Customer customer) { 
     customerService.addCustomer(customer); 
     return "customer_overview"; 
    } 

    public Customer getCustomer(){ 
     return customerService.getCustomer(); 
    } 
} 

index.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

    <html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 

    <h:head> 
     <title>EJB 3.0 Test</title> 
    </h:head> 
    <h:body> 
     <h:outputText value="#{customer.firstname}"/> 
     <h:form> 
      <h:outputText value="Imię"/> 
      <h:inputText id="firstname" name="firstname" value="#{customer.firstname}" /><br/> 

      <h:outputText value="Nazwisko"/> 
      <h:inputText id="lastname" name="lastname" value="#{customer.lastname}" /><br/> 

      <h:commandButton value="Dodaj" actionListener="#{customer.addCustomer}"/> 
     </h:form> 
</h:body> 
</html> 
+1

У вас есть смешанные пространства имен JSF и CDI. Попробуйте вместо этого импортировать javax.enterprise.context.RequestScoped'. Также ваш код бэк-кода и xhtml не совпадают, но я предполагаю, что это ошибка копирования и вставки. – mabi

+0

ОК, я отредактировал код (изменился на правильный оператор импорта и изменил аннотацию на '@Named (« customer »)), но все же после нажатия CommandButton у меня есть __Target Unreachable, идентификатор« клиент »разрешен для ошибки null__ –

+0

Как именно вы установили/включили CDI в своей среде? Он по умолчанию отключен и на некоторых серверах (например, Tomcat) даже по умолчанию не установлен. – BalusC

ответ

1

Подводя итог, глядя на Netbeans образец CDI приложение, фасоль, которая должна быть на JSF подъезд страницы необходимо:

  • имеют @Named аннотаций (javax.inject.Named)
  • имеют объем аннотация (как @SessionScoped, @RequestScoped, @ViewScoped), но импортирована из javax.enterprise.context. *
  • не должен иметь пустой, не аргумент конструктора
  • и дело, что не было в моем код - это то, что bean должен реализовать Serializable (java.io.Serializable)
  • Последнее, что если ваше приложение является веб-приложением, ему нужен beans.xml (может быть полностью пуст) в каталоге WEB-INF, если он является bean-приложением, он должен находиться в каталоге META-INF
0

Вы не упоминаете, какой контейнер сервлетов/сервер приложений и какую версию реализации CDI вы используете.

Я понятия не имею, что Spring Tool Suite принимает по умолчанию, предположительно это Tomcat, Spring и вообще нет CDI, поэтому вам нужно добавить и настроить реализацию CDI (например, Weld или OpenWebBeans).

Для CDI 1.0 вам нужно будет добавить дескриптор WEB-INF/beans.xml (который может быть пустым), чтобы открыть ваши бобы. Это больше не требуется для CDI 1.1.