Не могу создать экземпляр класса: p: filedownload, вызываемого до f: setPropertyActionListener - PullRequest
0 голосов
/ 28 марта 2012

У меня есть компонент fileDownload внутри dataTable, но когда я щелкаю по нему, кажется, что filedownloader вызывается до того, как переменная datlis.filepath установлена ​​setPropertyActionListener.

Когда я нажимаю «загрузить», я получаю «Не удается создать экземпляр класса: ui.FileDownloader.com.sun.faces.mgbean.ManagedBeanCreationException: Не удается создать экземпляр класса: ui.FileDownloader."

Мой код jsf:

<p:column headerText="Metadata" style="width:40px">  
   <p:commandButton id="selectButton" rendered="#{datlis.has_metadata}" icon="ui-icon-circle-arrow-s" title="View" ajax="false" >  
      <f:setPropertyActionListener value="#{datlis.filepath}" target="#{filedownloader.filepath}" />  
      <p:fileDownload value="#{filedownloader.file}" /> 
   </p:commandButton>  
</p:column>  

Компонент, который представляет «datlis», - это ViewScoped в моем приложении - и я проверил, что datlist.filepath не равен NULL.И бин загрузки файла (FileDownloader) выглядит следующим образом:

@ManagedBean(name="filedownloader")
@RequestScoped
public class FileDownloader {  

private StreamedContent file; 

public StreamedContent getFile() {  
    return file;  
}

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

public String getFilepath() {
    return filepath;
}
public void setFilepath(String filepath) {
System.out.println("> "+filepath);
    this.filepath = filepath;
System.out.println(">> "+this.filepath);
}

public FileDownloader() throws FileNotFoundException { 
System.out.println("100");
    String filename = "/opt/glassfish3/glassfish/domains/domain1/datasets/string_compare/Business v2 Metadata/README.txt";
        InputStream stream = new FileInputStream(filepath);
        file = new DefaultStreamedContent(stream, "text/txt", "README.txt");  
}  

Трассировка стека упоминает исключение нулевого указателя относительно inputsream, и поэтому я думаю, что переменная 'filepath' не установлена ​​- плюсмой системный вывод показывает только «100» из System.out.println, и никаких системных выходов из функции setFilepath ... как будто он вообще не вызывается.

Я также пробовал:

<p:column headerText="Metadata" style="width:40px">  
                <p:commandButton id="selectButton" rendered="#{datlis.has_metadata}" icon="ui-icon-circle-arrow-s" title="View" ajax="false" >  
                    <f:param name="filepath" value="#{datlis.filepath}" />  
                    <p:fileDownload value="#{filedownloader.file}" /> 
                </p:commandButton>  
            </p:column>

с добавленным кодом прямо над средством получения / установки пути к файлу в моем классе FileDownloader:

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

Но это также нене похоже на работу.Есть идеи?Я чувствую, что на правильном пути, возможно, просто неправильно использую элементы ...

1 Ответ

1 голос
/ 28 марта 2012

Управляемые свойства будут введены после строительства. Таким образом, вы получите NPE, если попытаетесь получить к ним доступ в конструкторе компонента.

Используйте метод, аннотированный @PostConstruct. Он будет автоматически вызываться после строительства и ввода свойства:

@PostConstruct
public void init() {
  // do your initializations here
}
...