2014-01-21 4 views
0

PostConstruct 메서드를 Initial requests으로 호출하십시오. 그러나 이미지를 업로드 할 때 PreDestroy 메서드를 여러 번 호출합니다. 즉, ImageActionBean의보기 ID가 각 FileUploadEvent에 대해 변경되었습니다. ViewID은 다른 페이지로 리디렉션되기 전에 변경된 것이므로 업로드 된 파일의 임시 저장을 지우려고했습니다.다중 호출 PreDestroy 메서드 (전경순) ViewScoped

세 이미지를 업로드하는 경우 PreDestroy 메서드를 네 번 호출하십시오. 그래서, 나는 하나의 파일을 가져온다.

내 환경

- JBoss 7.1.1 Final 
- primefaces-4.0-20130910.075046-7 
- omnifaces-1.7.jar 
- jboss-jsf-api_2.1_spec-2.0.5.Final.jar 

스택 추적 :

>>>>> Initialization Finished 
>>>>> Destroy Finished 
>>>>> Destroy Finished 
>>>>> Destroy Finished 
>>>>> Destroy Finished 


<h:form id="attachmentForm" enctype="multipart/form-data"> 
    <p:fileUpload fileUploadListener="#{ImageActionBean.handleProposalAttachment}" 
       mode="advanced" multiple="true" sizeLimit="3000000" update="attachmentTable" 
       allowTypes="/(\.|\/)(gif|jpe?g|png)$/" id="proposalAttachment"/> 

</h:form> 

@ManagedBean(name = "ImageActionBean") 
@ViewScoped <-- org.omnifaces.cdi.ViewScoped 
public class ImageActionBean implements Serializable { 
    private List<String> fileList; 

    @PostConstruct 
    public void init() { 
     fileList = new ArrayList<String>(); 
     System.out.println("Initialization Finished"); 
    } 

    @PreDestroy 
    public void destory() { 
     // clear uploaded file from temp storage 
     System.out.println("Destroy Finished"); 
    } 

    public List<String> getFileList() { 
     return fileList; 
    } 

    public void handleProposalAttachment(FileUploadEvent event) { 
     UploadedFile uploadedFile = event.getFile(); 
     String fileName = uploadedFile.getFileName().replaceAll("\\s", "_"); 
     fileList.add(fileName); 
     //save uploadedFile to temp storage 
    } 
} 

답변

1

The OmniFaces CDI @ViewScoped는 CDI와 함께 사용하도록 설계되어 있지 JSF 관리 콩, 콩을 관리. @ManagedBean은 CDI 관리 Bean이 아닌 JSF 관리 Bean을 작성합니다. JSF 관리 Bean 기능은 CDI 관리 Bean 범위를 지원하지 않지만 JSF 관리 Bean 범위 만 지원합니다. 아무도 명시 적으로 선언되지 않으면 기본 범위 @RequestScoped이 실제로 사용됩니다.

효과에서, 빈은 요청 | 위 빈이며 이는 관찰중인 증상을 완전히 설명합니다.

올바른 방법으로 OmniFaces CDI @ViewScoped을 사용하려면 @ManagedBean@Named으로 대체하여 실제 CDI 관리 빈을 만드십시오. 구체적인 문제에


관련없는

@Named 
@ViewScoped 
public class ImageActionBean implements Serializable { 
는 대문자와 인스턴스 변수 이름을 시작하는 완전히 Java naming conventions에 대한 것입니다. 기본적으로 다음과 같이 작업하고 있습니다.

ImageActionBean ImageActionBean = new ImageActionBean(); 

이것은 절대 권장하지 않습니다. 대신 효과적으로 수행해야합니다

#{imageActionBean}에 따라 EL 변수를 변경하십시오.

+0

'@ Named'라고 제안한대로 사용했습니다. 'PostConstruct' 메쏘드는 괜찮지 만, 다른 페이지를 탐색 할 때'PreDestroy' 메쏘드를 호출하지 않습니다. 심지어'h : commandLink'를 사용하여 탐색합니다. – CycDemo

+0

나를 위해 (그리고 쇼케이스에서) 작동합니다. 환경에 관한 모든 세부 사항과 함께 SSCCE가 도움이 될 것입니다. – BalusC

+0

예, 저에게는 도움이되었지만, CDI를 제 jsf 버전과 JBoss 7에 통합하기가 어렵습니다. Thz – CycDemo