gpt4 book ai didi

jsf - JavaEE6 : How to safeguard web application when the database shut down

转载 作者:行者123 更新时间:2023-12-04 14:05:10 24 4
gpt4 key购买 nike

首先,我的框架是带有 JSF、托管 bean、EJB 和 JPA 的 Java EE 6。我写了一个简单的程序来查询数据库中的信息。因此,当我单击一个按钮时,它会触发一个事件到托管 bean,其中事件监听器方法将访问 EJB 方法。 EJB 方法将对实体执行简单的select 查询。如果数据库在我选择之前或期间关闭,我会得到一个异常

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 51,460 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
Error Code: 0

我如何避免这种异常?绝对是 try, catch 这里,但不确定放在哪里。当我执行 em.createNamedQueryem.remove 时,我 try catch com.mysql.jdbc.exceptions.jdbc4.CommunicationsException,但我得到一个错误说:Exception com.mysql.jdbc.exceptions.jdbc4.CommunicationsException is never throw in body of corresponding try statement

下面是我的代码,我会在哪里捕获异常?

这是我的EJB

@Stateless
@LocalBean
public class DocumentSBean {
@PersistenceContext
private EntityManager em;

public List<User> listUser(){
Query query = em.createNamedQuery("User.listUser");
query.returnResultList();
}
}

这是我的ManagedBean

@ManagedBean(name="document")
@ViewScoped
public class DisplayListController implements Serializable {

@EJB
DocumentSBean sBean;

List<User> users = null;

public void foo(){
users = sBean.listUser();
}
}

编辑

我尝试了下面列出的两种方法,但在 Firebug 上仍然返回状态 200 而不是 500

<p:commandButton update="myform" actionListener="#{document.setDisplayFacility}" rendered="#{utility.admin}" value="Facilities"/>

<p:commandButton update="myform" actionListener="#{document.setDisplayFacility}" rendered="#{utility.admin}" value="Facilities">
<p:ajax actionListener="#{document.setDisplayFacility}" update="myform" event="click"/>
</p:commandButton>

这里是setDisplayFacility()

public void setDisplayFacility(){
facilities = sBean.getAllFacilities(); //sBean is EJB
displayFacility = true;
}

最佳答案

How do I safeguard away from this Exception? Definitely a try, catch here, but not sure where to put it.

只在可以合理处理的地方捕获异常。


I try to catch com.mysql.jdbc.exceptions.jdbc4.CommunicationsException, but I got an error said: Exception com.mysql.jdbc.exceptions.jdbc4.CommunicationsException is never thrown in body of corresponding try statement.

CommunicationsException在这种情况下是 DatabaseException嵌套异常. EclipseLink 在幕后已经捕获了 CommunicationsException并将其重新抛出为 DatabaseExceptionCommunicationsException作为根本原因。像这样的东西:

try {
// Execute query.
} catch (Exception e) {
throw new DatabaseException("Internal Exception: " + e, e);
}

理论上,只能这样处理:

try {
// Let EclipseLink execute query.
} catch (DatabaseException e) {
if (e.getCause() instanceof CommunicationsException) {
// Handle.
}
}

然而,在这种特殊情况下,这很丑陋,不推荐。


Below are my codes, where would I catch the Exception?

取决于您希望如何处理异常。如果你想在一个generic 错误页面中显示它,那么你不应该自己捕获它,而是让它去吧。然后 servletcontainer 将自己捕获并处理它。它将查找最匹配的 <error-page>web.xml并显示它。

<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/generic-error.xhtml</location>
</error-page>

这个会显示/generic-error.xhtml对于 java.lang.Exception所有 子类.

如果你想在一个特定的错误页面中显示它,那么你需要声明<exception-type>更具体以匹配实际的异常类型。例如:

<error-page>
<exception-type>org.eclipse.persistence.exceptions.DatabaseException</exception-type>
<location>/database-error.xhtml</location>
</error-page>

但是,尽管您的问题中未明确指定,但根据您的问题历史记录,我知道您将 JSF 与 PrimeFaces 一起使用.您需要记住,当 ajax 发出初始请求时,PrimeFaces 不会显示错误页面。相反,它的 ajax View 处理程序本身已经捕获了异常,并且它将委托(delegate)给 <p:ajaxStatus> 。 View 中的组件。尝试添加 ajax="false"到 PrimeFaces 命令组件,您最终会看到正在显示的 servletcontainer 的默认错误页面(如果在 web.xml 中找到匹配的页面,则可以看到您的任何错误页面)。

如果您想在 PrimeFaces 收到 ajax 错误时显示一些通用的 JSF UI,请使用 error <p:ajaxStatus> 的方面.例如

<p:ajaxStatus>
<f:facet name="start"><h:graphicImage value="images/ajax-loader.gif" /></f:facet>
<f:facet name="success"><h:outputText value="" /></f:facet>
<f:facet name="error">
<h:panelGroup layout="block" styleClass="ui-message-error ui-widget ui-corner-all">
<h:outputText value="An error has occurred!" /><br />
<h:outputLink value="#" onclick="window.location.reload(true)"><h:outputText value="Please reload page and retry" /></h:outputLink><br />
<h:outputLink value="mailto:support@example.com?subject=Ajax%20Error"><h:outputText value="If in vain, please contact support" /></h:outputLink>
</h:panelGroup>
</f:facet>
</p:ajaxStatus>

(但是在 PrimeFaces 2.2 RC1 中有一些 bug 导致显示错误方面失败,它在 PrimeFaces 2.1 中正常工作)

关于jsf - JavaEE6 : How to safeguard web application when the database shut down,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4146524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com