JSF файл скачать NullPointerException с видом параметра - PullRequest
1 голос
/ 06 марта 2012

Я надеюсь, что получу это прямо:

Я пытаюсь создать страницу JSF 2.0 , оптимизированную для мобильного использования на Tomcat 7 . Поэтому я использую Mojarra 2.1.6 и PrimeFaces (Core 3.1.1 и Mobile 0.9.1).

Мой сценарий:

  1. Пользователь посещает упрощенный URL, например, www.someurl.eu/view.xhtml/12345678
  2. ServletFilter переписывает URL-адрес на www.someurl.eu/view.xhtml?id=12345678
  3. Параметр URL предоставляется ManagedBean
  4. Данные Necessery оцениваются и публикуются в моем view.xhtml
  5. На моем view.xhtml предусмотрена кнопка для скачивания

Моя проблема:

При нажатии на кнопку сервер показывает мне NPE, когда для ManagedBean установлено значение @RequestScoped. Я предполагаю, что при нажатии на кнопку запускается новый запрос, мой URL-параметр теряется и файл загрузки больше не доступен. Я не знаю, прав ли я, но если так, я не знаю, как решить этот элегантный вопрос.

My ManagedBean:

@ManagedBean
@RequestScoped
public class ViewBean {

// Elements
...
private StreamedContent file;
...

// Getter and Setter
...
public StreamedContent getFile() {
    invalidateSession();
    return file;
}
public void setFile(StreamedContent file) {
    this.file = file;
}
...

// Init
@PostConstruct
public void init() {

    //read URL-Parameter
    urlSdbac = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");

    // validate
    if(urlSdbac == null || urlSdbac.equals("") || urlSdbac.length() != 8) {
        urlSdbac = "invalid";
    }
    // get Data
    else {
        SdbCustomerData cd = getFileMetadata(urlSdbac);

        if(cd == null) {
            this.name = "invalid code";
            this.language = "no language options found";
        }
        else {
            ...
            // prepare File for Download
            this.file = new Helper().getWebDavFile(cd.getCid(), cd.getName());
        }
    }
}

My view.xhtml:

<h:form>  
  <pm:page title="Download">
    <pm:view>
        <pm:content>
        ...
            <p:commandButton  value="Download" ajax="false">
                    <p:fileDownload value="#{viewBean.file}" />
            </p:commandButton>
        </pm:content>
    </pm:view>
  </pm:page>
</h:form>

И последнее, но не менее важное: мой фильтр:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    String url = request.getRequestURI();

    Pattern sdbac = Pattern.compile("[A-Za-z0-9]{8}");
    Matcher fit = null;

    // check Page
    if(url.contains("view.xhtml/") && (!url.contains("?id=") && !url.endsWith("view.xhtml")) ) {
        String code = url.substring(url.indexOf("view.xhtml/")+11, url.length());
        // validate Param?
        fit = sdbac.matcher(code);
        if(fit.matches()) {
            // redirect
            response.sendRedirect("/getSDS/view.xhtml?id=" + code);
        }
        else {
            // redirect
            response.sendRedirect("/getSDS/view.xhtml?id=invalid");
        }
    }
    else {
        chain.doFilter(req,res);
    }
} 

Мой фильтр сопоставлен с любым URL <url-pattern>/*</url-pattern>

Я также пытался установить для ManagedBean значение @ SessionScoped . Если я это сделаю, загрузка будет работать нормально, но пользователь не сможет изменить URL-адрес из-за постоянных данных в области действия ManagedBean.

Может быть, я слишком слеп, чтобы увидеть очевидное решение.

Любая помощь будет принята с благодарностью! Заранее спасибо!

P.S. Исключение

java.lang.NullPointerException
org.primefaces.component.filedownload.FileDownloadActionListener.processAction(FileDownloadActionListener.java:58)
javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
javax.faces.component.UICommand.broadcast(UICommand.java:300)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
eu.qualisys.getsds.filter.SDBACParamFilter.doFilter(SDBACParamFilter.java:53)

1 Ответ

2 голосов
/ 06 марта 2012

Используйте область просмотра.

@ManagedBean
@ViewScoped

См. Также:

...