2014-10-07 7 views
2

У меня проблема с аннотацией JSF2 @ManagedProperty. У меня есть управляемый компонент, который создает пользователя, а затем я хочу передать этого пользователя другому компоненту, чтобы отобразить другую информацию относительно этого пользователя. Так что мой код ниже:JSF @managedproperty и @PostConstruct

@Named("userController") 
@SessionScoped 
public class UserController implements Serializable { 

@EJB 
private session.UserFacade ejbFacade; 
private List<User> items = null; 
private User selected; 
private User utente; 
private String user; 
private String pass; 
----getter and setter---- 

В Schedule Bean я использую фасоль UserController в @PostConstruct:

@Named(value = "scheduleController") 
@SessionScoped 
public class ScheduleController implements Serializable { 

private ScheduleModel eventModel; 

private ScheduleEvent event = new DefaultScheduleEvent(); 

@EJB 
ActivityFacade ejbFacade; 

@ManagedProperty(value="#{userController}") 
private UserController credentials; 


public ScheduleController() {   
} 

@PostConstruct 
public void init(){ 
    eventModel = new DefaultScheduleModel();  
    List<Activity> daFare =ejbFacade.findForUser(credentials.getUtente().getIdUser()); 
    for(int i=0;i<daFare.size();i++){ 
     eventModel.addEvent(new DefaultScheduleEvent(daFare.get(i).getDescrizione(),daFare.get(i).getDalleOre(),daFare.get(i).getAlleOre())); 
    } 
} 

public void setCredentials(UserController credentials) { 
    this.credentials = credentials; 
} 

Когда я отладки кода, я вижу, что учетные данные UserController всегда нуль. ... Что не так ? Мне нужно указать что-то в faces-config.xml? Большое спасибо за советы.

EDIT:

После изменения @ManagedProperty с @Inject и после добавления ниже beans.xml в папку WEB-INF, проблема сохраняется.

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 

Приложение работы таким образом: пользователь может войти через эту верстку страницы:

<body> 
    <h:form> 
     <p:growl id="msgs" showDetail="true" /> 
     <p:panel header="Inserisci i tuoi dati" style="margin: 0 auto; text-align: center" > 
      <h:panelGrid columns="2" cellpadding="5" style="margin: 0 auto; text-align: center"> 
       <p:outputLabel value="Username"/> 
       <p:inputText value="#{userController.user}" required="true" label="Username" size="40"/> 
       <p:outputLabel value="Password" /> 
       <p:password value="#{userController.pass}" required="true" label="Password" size="40"/> 
       <p:commandButton action="#{userController.validateLogin}" value="Login" update="msgs" ajax="false" style="text-align: center"/> 
      </h:panelGrid> 
     </p:panel>   
    </h:form> 

</body> 

После отправить форму, то UserController проверить, что этот конкретный пользователь существует в таблицу DB, а затем создать экземпляр User utente (идентификатор, имя пользователя, пароль, адрес электронной почты как поле). После этого приложение перенаправляется на home.xhtml, который отображает несколько данных пользователя и выбирает несколько информации из таблицы БД, выбранной по идентификатору пользователя. Вот код, где я установил пользователя utente:

public String validateLogin(){ 

    String output="home"; 
    boolean exist=false; 
    exist=ejbFacade.logValid(user,pass); 
    if(!exist){ 
     //FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
     FacesContext context = FacesContext.getCurrentInstance(); 
     context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Username o Password errata","Contattare l'amministratore"));    
     return "index"; 
    }else{ 
     utente=ejbFacade.setUtente(user); 
     FacesContext context = FacesContext.getCurrentInstance();   
     context.addMessage(null, new FacesMessage("Accesso eseguito con successo.","Bentornato " + user)); 
     return output; 
    } 
} 

Последовательность кода, в котором я контролировать existece пользователя, и установить utente является:

@Stateless 
public class UserFacade extends AbstractFacade<User> { 
@PersistenceContext(unitName = "ImmobiliareWebPU") 
private EntityManager em; 

@Override 
protected EntityManager getEntityManager() { 
    return em; 
} 

public UserFacade() { 
    super(User.class); 
} 

public boolean logValid(String user, String pass) { 
    List<User> utente ; 
    boolean autorizzato; 
    String find = "User.findByUsername&Password"; 
    Query query = em.createNamedQuery(find, User.class); 
    query.setParameter("username", user); 
    query.setParameter("password", pass); 
    utente =query.getResultList(); 
    if (utente.isEmpty()) { 
     autorizzato=false;   
    } 
    else{ 
     autorizzato=true;      
    } 
    return autorizzato; 
} 

public User setUtente(String user) { 
    //SETTO L'UTENTE PER LA SESSIONE DEL PROGRAMMA 
    User utente; 
    String find = "User.findByUsername"; 
    Query query = em.createNamedQuery(find, User.class); 
    query.setParameter("username", user);  
    utente =(User) query.getSingleResult(); 

    return utente; 
} 

}

Кодекса где мне нужна информация пользователя:

@Named(value = "scheduleController") 
@RequestScoped 
public class ScheduleController implements Serializable { 

private ScheduleModel eventModel; 

private ScheduleEvent event = new DefaultScheduleEvent(); 

@EJB 
ActivityFacade ejbFacade; 

@Inject 
private UserController credentials; 


public ScheduleController() {   
} 

@PostConstruct 
public void init(){ 
    eventModel = new DefaultScheduleModel();  
    List<Activity> daFare =ejbFacade.findForUser(credentials.getUtente().getIdUser()); 
    for(int i=0;i<daFare.size();i++){ 
     eventModel.addEvent(new DefaultScheduleEvent(daFare.get(i).getDescrizione(),daFare.get(i).getDalleOre(),daFare.get(i).getAlleOre())); 
    } 
} 

В ejbFacade я делаю простой запрос:

@Stateless 
public class ActivityFacade extends AbstractFacade<Activity> { 
@PersistenceContext(unitName = "ImmobiliareWebPU") 
private EntityManager em; 

@Override 
protected EntityManager getEntityManager() { 
    return em; 
} 

public ActivityFacade() { 
    super(Activity.class); 
} 

public List<Activity> findForUser(int utenteId) { 
    //RICHIEDO LE ATTIVITA' DEL SINGOLO UTENTE 
    List<Activity> daFare ; 
    String find = "Activity.findByUserId"; 
    Query query = em.createNamedQuery(find, Activity.class); 
    query.setParameter("idUser", utenteId); 
    daFare =query.getResultList(); 

    return daFare; 
} 

} 

В режиме отладки я вижу istance из UserController со всеми нулевыми полями; это, похоже, новый статус UserController. Я также использую «import javax.enterprise.context.SessionScoped». Где моя вина?

+0

Если вы отлаживать 'utente = ejbFacade.setUtente (пользователь);' линия, является 'utente' не равно нулю? Я бы сказал, что метод 'setUtente (...)' либо ошибочен именован (вы пытаетесь *** получить *** объект из EJB) или не является подходящим методом, заданным вашим кодом. – dic19

+0

utente не является нулевым. Он имеет все правильное значение поля. Каков правильный путь к сущности из таблицы БД? Я, хотя, получаю это от фасада EJB, был лучшим способом .... Я добавил последовательность кода выше @ dic19 –

+0

Правильно, но я бы переименовал 'setUtente (...)' to 'getUtentePerNome (...) ', так как это то, что на самом деле делает метод. Все в вашем коде выглядит прекрасно и должно работать нормально, я не вижу ничего странного. Обратите внимание, что в '' beans.xml 'отсутствует тег' ', но я думаю, что это просто проблема с копированием. – dic19

ответ

3

Когда я отлаживаю код, я вижу, что учетные данные UserController равны всегда null .... Что случилось?

Обратите внимание, что вы смешиваете CDI (Context and Dependency Injection) с управляемыми свойствами, что, вероятно, вызывает описанное поведение.Ваши бобы аннотируются @Named вместо @ManagedBean так это:

@ManagedProperty(value="#{userController}") 
    private UserController credentials; 

Должен быть заменен следующим образом:

@Inject 
    private UserController credentials; 

Для действительно большого объяснения о разнице между CDI и подпирая фасолью см @BalusC ответ в эту тему: Backing beans (@ManagedBean) or CDI Beans (@Named)?.


мне нужно указать что-то в лицах-config.xml?

Нет, но вы должны включать в себя beans.xml, как проиллюстрировано здесь: Packaging CDI applications. Насколько я помню, этот файл является обязательным, независимо от режима обнаружения. Вот beans.xml, что вы можете автоматически создавать в среде NetBeans:

Новый файл ->контекст и Dependency Injection ->beans.xml (КДИ конфигурации файла).

Это все, что я когда-либо необходимо, чтобы сделать работу CDI:

<?xml version="1.0" encoding="UTF-8"?> 
<beans 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/beans_1_1.xsd" 
     bean-discovery-mode="annotated"> 
</beans> 
+0

Благодарим вас за ответ. Теперь я знаю, что существует разница между Named и ManagedBean. Но проблема сохраняется! Теперь, после замены ManagedProperties с помощью Inject и создания пустого файла beans.xml, при отладке кода я вижу, что переменные, содержащие введенный UserController, имеют все нулевые поля. Что-то я должен изменить? Кажется, это новый статус UserController, а не первый, который я получил. Еще раз спасибо за ваши ответы. –

+0

Хорошо, что хорошая новость - это инъекция. Обратите внимание, что вам не нужно явно ничего не устанавливать, потому что обе бобы управляются. Если 'UserController' выглядит как новый экземпляр, это потому, что контейнер не создавал экземпляр раньше (потому что он не нужен). Трудно дать вам конкретный ответ, зная поток в вашем приложении. Возможно, вы можете опубликовать последовательность в том, что вы называете ваши бобы, а не только их определение. @ClaudioCerino – dic19

+0

У меня есть вопрос с кодовой последовательностью. Надеюсь, ты сможешь осветить меня. Еще раз спасибо @ dic19 –