JSF ruft Methoden auf, wenn der verwaltete Bean-Konstruktor 404 ERROR CODE @ sende
In einem JSF-verwalteten Bean-Konstruktor lade ich eine Entität aus der Datenbank, indem ich einen Anforderungsparameter verwende. Manchmal befindet sich die Entität nicht in der Datenbank und ich möchte eine andere JSF-Seite (.xhtml) mit einer 404-Nachricht anzeigen.
Dies ist ein Beispiel für eine verwaltete Bohne:
@ManagedBean(name = "someBean")
@RequestScoped
public class SomeBean implements Serializable {
private static final long serialVersionUID = 1L;
private SomeData someData;
public SomeBean() throws IOException {
someData = ... loads from database using JPA features
if(someData == null){
HttpServletResponse response = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
response.sendError(404);
}
}
public SomeData getSomeData(){
return someData;
}
}
Ich habe die Datei web.xml in etwa so konfiguriert:
<error-page>
<error-code>404</error-code>
<location>/404.xhtml</location>
</error-page>
Ich habe eine JSF-Seite, um die von der verwalteten Bean geladene Entität zu behandeln. Wenn die Entität existiert, werde ich sie auf der Seite verwenden. So wie das
<h1>#{someBean.someEntity.name}</h1>
<h2>#{someBean.someEntity.description}</h2>
<ui:repeat value="#{someBean.someEntity.books}" var="book">
// ..........
</ui:repeat>
Die obige Seite funktioniert, wenn die verwalteten Daten erfolgreich geladen wurden.
Das ProbleWenn die Entität nicht existiert und ich einen 404-FEHLERCODE sende, verarbeitet die JSF weiterhin die in der Ausdruckssprache der ersten Seite definierten Methoden.
Dieses Verhalten führt dazu, dass die verwaltete Bean eine NullPointerException und einen HTTP 500-ERRO-CODE auslöst.
Meine 404-Fehlerseite wird nicht aufgerufen. Keine Ahnung warum
Ich versuche, den 404-Fehler zu senden, auch wenn die Entität in der Datenbank gefunden wurde und die 404-Fehlerseite funktioniert.
ann jemand dieses JSF-Verhalten diesem Glück erklären? Oder bieten Sie eine Art an, um die 404-Fehlerseite ohne URL-Änderung anzuzeigen?