2013-08-11 2 views
0

javax.faces.view.ViewScoped에서 @Named 주석과 함께 @ViewScoped를 사용하려고하지만 어떤 이유로 내 페이지의 일부를 업데이트하기 위해 내 작업을 호출 할 때마다 콩이 다시 인스턴스화하고 나는 예상 된 결과를 얻지 못한다! @ManagedBean 및 viewScoped (javax.faces.beans.ViewScoped)를 사용하면 정상적으로 작동합니다.JSF2.2 lifeCycle의 CDI 용 ViewScoped

또 다른 질문은 빈이 두 번 이상 인스턴스화되는 이유입니다. 응용 프로그램 서버 동작 때문입니까 ?? 여기

내 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:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:p="http://primefaces.org/ui"> 

<h:head></h:head> 
<h:body> 
<h:form id="form"> 
    <p:growl id="growl" showDetail="true"></p:growl> 
    <p:fieldset legend="Search Criteria" toggleable="true" 
     toggleSpeed="100"> 
     <p:panelGrid> 
      <p:row> 
       <p:column> 
        <p:outputLabel for="id" value="User Id"> </p:outputLabel> 
       </p:column> 
       <p:column> 
        <p:inputText id="id" value="#{test.id}"> </p:inputText> 
       </p:column> 
      </p:row> 
      <p:row> 
       <p:column> 
        <p:outputLabel for="username" value="Username"></p:outputLabel> 
       </p:column> 
       <p:column> 
        <p:inputText id="username" value="# {test.name}"></p:inputText> 
       </p:column> 
      </p:row> 
      <p:row> 
       <p:column> 
        <p:outputLabel for="pass" value="Password"></p:outputLabel> 
       </p:column> 
       <p:column> 
        <p:inputText id="pass" value="#{test.password}"></p:inputText> 
       </p:column> 
      </p:row> 
      <p:row> 
       <p:column></p:column> 
       <p:column> 
        <p:commandButton value="Search" action="#{test.searchAction}" 
         update="table"> 

        </p:commandButton> 
       </p:column> 
      </p:row> 

     </p:panelGrid> 

    </p:fieldset> 
    <p:fieldset legend="Search Result"> 
     <p:dataTable id="table" paginator="true" rows="20" 
      value="#{test.users}" selectionMode="single" var="user" 
      selection="#{test.user}" rowKey="#{user.userId}"> 
      <p:ajax event="rowSelect" listener="#{test.selectRow}" 
       oncomplete="dialog.show();" update=":form:growl :grid"></p:ajax> 
      <p:column headerText="User ID"> 
       <h:outputText value="#{user.userId}" /> 
      </p:column> 
      <p:column headerText="Username"> 
       <h:outputText value="#{user.userName}" /> 
      </p:column> 
      <p:column headerText="Password"> 
       <h:outputText value="#{user.userPassword}" /> 
      </p:column> 
      <f:facet name="footer"> 
       <p:commandButton value="Proceed" update=":grid" 
        oncomplete="dialog.show();"> </p:commandButton> 
      </f:facet> 

     </p:dataTable> 

    </p:fieldset> 

</h:form> 

<p:dialog widgetVar="dialog" appendToBody="true"> 
    <p:panelGrid columns="2" id="grid"> 
     #{test.user.userId} 
     <p:spacer></p:spacer> 
     <p:commandButton value="Save" action="#{test.saveAction}"> 
     </p:commandButton> 
    </p:panelGrid> 
</p:dialog> 


</h:body> 
</html> 

여기 내 다시 콩입니다 :

package com.meysam.app.mypocekt.managedbean; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.faces.application.FacesMessage; 
import javax.faces.context.FacesContext; 
import javax.faces.view.ViewScoped; 
import javax.inject.Named; 

import org.primefaces.event.SelectEvent; 

import com.meysam.app.mypocket.jpa.User; 

@Named(value = "test") 
@ViewScoped 
public class TestBean implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1275620800039726757L; 
private User user; 
private String name; 
private Long id; 
private String password; 
private List<User> users; 

public TestBean() { 
    users = new ArrayList<>(); 
    System.out.println("Constructor"); 
} 

@PostConstruct 
public void init() { 
    System.out.println("postConstruct"); 
} 

public User getUser() { 
    return user; 
} 

public String searchAction() { 
    System.out.println("search Action"); 
    for (int i = 20; i < 40; i++) { 
     User user = new User(); 
     user.setUserId(new Long(i)); 
     user.setUserName("MyName" + i); 
     user.setUserPassword("password" + i); 
     users.add(user); 
    } 
    return null; 
} 

public String saveAction() { 
    System.out.println("next"); 
    return "next?faces-redirect=true"; 
} 

public void selectRow(SelectEvent event) { 

    // User user = (User) event.getObject(); 
    System.out.println("User: " + user.getUserName()); 
    FacesMessage msg = new FacesMessage("User: " + user.getUserName()); 
    System.out.println("selected event" + user.getUserName()); 
    FacesContext.getCurrentInstance().addMessage(null, msg); 
} 

public void setUser(User user) { 
    this.user = user; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public List<User> getUsers() { 
    return users; 
} 

public void setUsers(List<User> users) { 
    this.users = users; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 
} 

내가 페이지를 새로 고침 한 후 검색 버튼을 클릭하면이 내 콘솔 결과입니다

15:43:34,667 INFO [stdout] (default task-32) Constructor 

15:43:34,668 INFO [stdout] (default task-32) postConstruct 

15:43:34,673 INFO [stdout] (default task-32) Constructor 

15:43:34,673 INFO [stdout] (default task-32) postConstruct 

15:43:34,674 INFO [stdout] (default task-32) Constructor 

15:43:34,674 INFO [stdout] (default task-32) postConstruct 

15:43:34,676 INFO [stdout] (default task-32) Constructor 

15:43:34,676 INFO [stdout] (default task-32) postConstruct 

15:43:34,677 INFO [stdout] (default task-32) Constructor 

15:43:34,677 INFO [stdout] (default task-32) postConstruct 

15:43:34,678 INFO [stdout] (default task-32) Constructor 

15:43:34,678 INFO [stdout] (default task-32) postConstruct 

15:43:34,679 INFO [stdout] (default task-32) Constructor 

15:43:34,680 INFO [stdout] (default task-32) postConstruct 

15:43:39,851 INFO [stdout] (default task-33) Constructor 

15:43:39,852 INFO [stdout] (default task-33) postConstruct 

15:43:39,852 INFO [stdout] (default task-33) Constructor 

15:43:39,853 INFO [stdout] (default task-33) postConstruct 

15:43:39,853 INFO [stdout] (default task-33) Constructor 

15:43:39,853 INFO [stdout] (default task-33) postConstruct 

15:43:39,854 INFO [stdout] (default task-33) Constructor 

15:43:39,854 INFO [stdout] (default task-33) postConstruct 

15:43:39,855 INFO [stdout] (default task-33) Constructor 

15:43:39,855 INFO [stdout] (default task-33) postConstruct 

15:43:39,855 INFO [stdout] (default task-33) Constructor 

15:43:39,856 INFO [stdout] (default task-33) postConstruct 

15:43:39,856 INFO [stdout] (default task-33) Constructor 

15:43:39,856 INFO [stdout] (default task-33) postConstruct 

15:43:39,857 INFO [stdout] (default task-33) Constructor 

15:43:39,857 INFO [stdout] (default task-33) postConstruct 

15:43:39,857 INFO [stdout] (default task-33) Constructor 

15:43:39,857 INFO [stdout] (default task-33) postConstruct 

15:43:39,858 INFO [stdout] (default task-33) Constructor 

15:43:39,858 INFO [stdout] (default task-33) postConstruct 

15:43:39,858 INFO [stdout] (default task-33) Constructor 

15:43:39,859 INFO [stdout] (default task-33) postConstruct 

15:43:39,859 INFO [stdout] (default task-33) Constructor 

15:43:39,859 INFO [stdout] (default task-33) postConstruct 

15:43:39,860 INFO [stdout] (default task-33) Constructor 

15:43:39,860 INFO [stdout] (default task-33) postConstruct 

15:43:39,861 INFO [stdout] (default task-33) Constructor 

15:43:39,861 INFO [stdout] (default task-33) postConstruct 

15:43:39,861 INFO [stdout] (default task-33) Constructor 

15:43:39,862 INFO [stdout] (default task-33) postConstruct 

15:43:39,862 INFO [stdout] (default task-33) Constructor 

15:43:39,862 INFO [stdout] (default task-33) postConstruct 

15:43:39,863 INFO [stdout] (default task-33) Constructor 

15:43:39,863 INFO [stdout] (default task-33) postConstruct 

15:43:39,863 INFO [stdout] (default task-33) Constructor 

15:43:39,863 INFO [stdout] (default task-33) postConstruct 

15:43:39,864 INFO [stdout] (default task-33) Constructor 

15:43:39,864 INFO [stdout] (default task-33) postConstruct 

15:43:39,864 INFO [stdout] (default task-33) Constructor 

15:43:39,864 INFO [stdout] (default task-33) postConstruct 

15:43:39,865 INFO [stdout] (default task-33) Constructor 

15:43:39,865 INFO [stdout] (default task-33) postConstruct 

15:43:39,865 INFO [stdout] (default task-33) search Action 

15:43:39,872 INFO [stdout] (default task-33) Constructor 

15:43:39,872 INFO [stdout] (default task-33) postConstruct 

15:43:39,872 INFO [stdout] (default task-33) Constructor 

15:43:39,873 INFO [stdout] (default task-33) postConstruct 

15:43:39,873 INFO [stdout] (default task-33) Constructor 

15:43:39,874 INFO [stdout] (default task-33) postConstruct 

15:43:39,874 INFO [stdout] (default task-33) Constructor 

15:43:39,874 INFO [stdout] (default task-33) postConstruct 

15:43:39,876 INFO [stdout] (default task-33) Constructor 

15:43:39,876 INFO [stdout] (default task-33) postConstruct 

감사합니다.

답변

1

두 주석 (CDI 및 JSF)이 함께 작동하지 않습니다. 틈을 메우기 위해 확장 기능을 작성하거나 CODI 또는 Apache DeltaSpike를 사용해야합니다.

(ViewScope 주석이 나오는) JSF 2.0에는 CDI 통합이 없었습니다.

+1

실제로는 사실이 아닙니다. JSF 2.2와 함께 제공되는 javax.faces.view.ViewScoped입니다. 따라서 실제로 CDI와 호환되어야합니다. –

+0

위의 코드에서 패키지 변경을 발견하지 못했습니다. 나는 SOOO 다행히도 그들은 같은 이름을 지어서 패키지를 변경하여 우리에게 두통을 더주었습니다 * – LightGuard

+0

JSF 2.2를 사용하고 있습니다. 기본적으로 CDI viewScope는 이미 JSF 2.2에서 제공되고 있습니다! – meysamabl