- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我的框架是带有 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.createNamedQuery
或 em.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
并将其重新抛出为 DatabaseException
与 CommunicationsException
作为根本原因。像这样的东西:
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/
我是一名优秀的程序员,十分优秀!