2011-02-04 5 views
4

빈 생성자 및 ViewScope 호출과 관련하여 다른 질문을 보았습니다. 여전히 어려움을 겪고 있습니다. 내가 겪고있는 문제는 응용 프로그램에서 두 개의 특정 페이지를 포함합니다. 첫 번째는 dataTable입니다 (이제는 무작위로 생성 된 데이터로 채워지지만 결국 데이터베이스를 호출합니다). 두 번째 페이지는 선택된 행의 정보가 편집 또는보기 용으로 표시되는 매우 간단한 표시 페이지입니다. 내 detail.xhtml 페이지입니다. 이 페이지의 빈 (bean)입니다. 해당 생성자가 두 번 호출됩니다. 첫 번째로 페이지로 이동하면 다시 commandButton을 눌러 변경 사항을 제출할지 또는 변경 사항을 취소할지 여부가 중요하지 않으며 detail.xhtml 백업 빈의 생성자가 두 번째로 호출됩니다.ViewScope 생성자가 두 번 호출되었지만 이유가 확실하지 않습니다.

내 콩 @ViewScoped, 수입은 javax.faces.bean.ViewScoped입니다. 차이를 만들 수있는 몇 가지 다른 세부 사항이 있지만 그 이유를 이해하지 못한다면 : 내 UserDetailBean.java는 기본 bean (원래 UIBaseBean.java라고 부릅니다)에서 상속합니다. 자, 내 UIBaseBean은 @RequestScoped입니다. 내 UserDetailBean이 @ViewScoped이기 때문에 나는 이해할 수 있지만 차이가 없어야한다. 내가 틀렸다면 나를 바로 잡아라.

다른 점은 UIBaseBean과 UserDetailBean의 생성자에서 변수를 설정하는 것입니다. 내 페이지 상단의 툴바에 사용자의 위치를 ​​표시하고 싶습니다. 이를 위해 UIBaseBean에서 변수를 만들었습니다.

protected String toolbarDescription; 

또한 setter와 getter를 UIBaseBean에 제공했습니다. 그 정의는 너무 내 응용 프로그램에서 특정 페이지에 대한 백업 빈의 변수를 대체 할 알고있다

toolbarDescription = "fix me"; 

: UIBaseBean의 생성자에서 나는 변수를 정의합니다. 내 UserDetailBean에서 문자열 toolbarDescription에 새 값을 할당합니다. 이 값은 detail.xhtml 페이지에 표시됩니다. 그렇지 않으면 내 detail.xhtml 페이지의 bean은 매우 직설적이며 detail.xhtml 페이지의 양식에 데이터 표시를위한 속성을 가져오고 설정합니다.

세부 정보 페이지가 설정되어 리디렉션과 함께 탐색이 이루어지며 리디렉션이있는 경우 (commandButton을 누르면) 리디렉션이 발생합니다. faces-config 탐색 규칙을 사용하거나 사용하지 않고 리디렉션을 사용하고 리디렉션을 사용하거나 사용하지 않는 암시 적 탐색을 시도했지만 UserDetailBean 생성자는 항상 두 번 호출됩니다.

아, 두 번 프로그램을 중지하는 UserDetailBean 생성자의 toolbarDescription 변수에 중단 점을 설정합니다. 페이지가 처음 호출 될 때와 다시 세부 정보 페이지의 commandButton을 누른 후 다시 누릅니다.

내가 설명한대로 누군가가 내 생성자가 두 번 호출되는 이유를 알 수 있습니까? 콩을 잘못 디자인했거나 응용 프로그램에 문제가 있습니까?

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 
import javax.faces.event.ActionEvent; 
import [package name].UIBaseBean;  
import java.util.Locale; 
import javax.faces.bean.ManagedProperty; 


@ManagedBean 
@ViewScoped 

public class UserDetailBean extends UIBaseBean { 

@ManagedProperty(value = "#{param.action}") 
private String action; 

private String firstName; 
private String lastName; 
private String jobTitle; 
private String DOH; 
private String location; 
private String status; 
private String comments; 
@ManagedProperty(value = "#{param.id}") 
private String id; 
private String tabTitle; 

private boolean editMode; 
private boolean viewMode; 

private ClUserDetail dBUserDetail;  

    /** Creates a new instance of UserDetailBean */ 
    public UserDetailBean() { 
     toolbarDescription = CoreMsgBundle.getMessageFromResourceBundle("UserDetail", Locale.ENGLISH); 
    } 

답변

4

당신은 UIBaseBean에서 @RequestScoped 및 기타 관련 주석을 제거 (그리고 abstract 할) 필요가있다. 이 작업이 완료되면

은 또한 <f:viewParam>에 의해 #{param}@ManagedProperty 중 하나를 정의 할를 해결하기 위해 또는 그 대신 ExternalContext#getRequestParameterMap() 얻을 수 있어야합니다. 즉 범위가 더 넓은 것을 무언가에 주입하는 것은 불가능합니다 (수용자의 범위 내에서 더 많은 것이있을 수 있기 때문에 어느 것이 주입되어야하는지 명확하지 않기 때문에). JSF는 bean의 생성 중에 예외를 던질 것이다.

+0

대단히 고맙습니다.이 코드는 원래 코드가 작동되기를 기대하면서 정확하게 작동합니다. @ManagedProperty에 관해서는 나쁜 정보라는 좋은 이해가없는 작은 정보의 예입니다. 나는 [이 답변] (http://stackoverflow.com/questions/4888942/viewparam-vs-managedpropertyvalue-param-id)을 읽고 "오, 좋은 생각인데, 내 신청서에서 그렇게하겠습니다"라고 생각했습니다. – Sean

+0

네 말이 맞아. 답변을 업데이트했습니다. – BalusC

+0

@balusc ViewScoped 빈 생성자가 여러 번 호출된다는 점에서 비슷한 문제가 있습니다. Bean은 유틸리티 기능을 제공하지만 Bean 자체는 아닌 기본 클래스를 확장합니다. 여기서 기본 클래스는 추상화로 표시되었지만 생성자는 여전히 두 번 호출됩니다. 이것이 일어날 수있는 다른 이유가 있습니까? 1.2에서 2.0으로 마이그레이션하는 과정에서 주석 대신 faces-config.xml에서 bean을 선언했음을 주목할 필요가 있습니다. – Lucas

관련 문제