Jsf 事务中止错误消息通知更改

Jsf 事务中止错误消息通知更改,jsf,messages,Jsf,Messages,我向数据库表中添加了唯一约束,以防止重复条目。我已经测试了它和它的工作状态,在我的页面上,当我尝试提交相同的值时,我收到一条消息,说事务中止,这意味着它的工作状态良好,有没有办法更改消息: 事务中止 例如: 任务已分配给用户 如果是,我将如何改变它? 如果可能,只更改唯一约束冲突的消息,那将非常好 我选择值并使用创建方法保存它们: public String create() { try { getFacade().create(current);

我向数据库表中添加了唯一约束,以防止重复条目。我已经测试了它和它的工作状态,在我的页面上,当我尝试提交相同的值时,我收到一条消息,说事务中止,这意味着它的工作状态良好,有没有办法更改消息:

事务中止

例如:

任务已分配给用户

如果是,我将如何改变它? 如果可能,只更改唯一约束冲突的消息,那将非常好

我选择值并使用创建方法保存它们:

public String create() {
        try {
            getFacade().create(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("webConstants/Bundle").getString("TimeLoggingDetailCreated"));
            recreateModel();
            return prepareCreate();
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("webConstants/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }
并在页面上显示如下消息:

<h:panelGroup id="messagePanel" layout="block" >
                <h:messages infoClass="alert alert-success" errorClass="alert alert-danger" layout="row col-12" warnClass="alert alert-info" fatalClass="alert"/>
            </h:panelGroup>
web.xml:

<context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

javax.faces.PROJECT_阶段
发展
简短版本:只需删除JsfUtil.addErrorMessage(…)中的“e”

似乎您使用的是像我这样的Netbeans生成的代码:-) 我遇到了同样的问题,但我找到了问题的根源。。 类JSFUtil中有一个addErrorMessage(…)方法,该方法由异常调用,它查找并找到了异常(EJBException)的本地化字符串

问题-在本例中未使用第二个参数“String defaultMsg”

public static void addErrorMessage(Exception ex, String defaultMsg) {
    String msg = ex.getLocalizedMessage();
    System.out.println("DefaultMsg: " + defaultMsg);
    System.out.println("LocalMsg: " + msg);

    if (msg != null && msg.length() > 0) {
        addErrorMessage(msg);
    } else {
        addErrorMessage(defaultMsg);
    }
}
因此,您可以重写该方法,或者只在try..catch块中使用addErrorMessage(String msg),它直接从Bundle.properites文件返回您自己的字符串

public void create() {
        try {
            getFacade().create(current);
            recreateModel();
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("StandortCreated"));
        } catch (EJBException e) {
            JsfUtil.addErrorMessage(ResourceBundle.getBundle("/Bundle").getString("YourOwnFromBundle"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

答案取决于当前消息的确切来源以及您当前显示该消息的方式。此信息在问题中不可用,因此此问题无法回答。您好,这是一个crud应用程序,我正在尝试新的东西,我已将代码添加到问题中,您究竟如何无法更改错误消息?有了这段代码,就有点太明显了,以至于我无法想象和理解您在这方面到底是如何失败的。一点逻辑思考和常识应该已经暗示,您只需向捆绑包中添加一条新消息并引用它,而不是
“persistenceErrorOccursed”
,对吗?@BalusC In the bundle:persistenceErrorOccursed=发生了持久性错误。所以“PersistenceErrorOccursed”一开始就没有被调用,所以即使我在bundle中创建了一条新消息并引用它,它也不会被使用?我的问题是,我收到一条消息说事务已中止,而不是发生了持久性错误。错误代码是1062,来自org.eclipse.persistence.exceptions.DatabaseException.sqlException。所以我的问题是:如何更改“事务中止”错误文本?好的,这确实是一个严重的问题。事实上,这是一个奇怪的问题,因为您在
异常上有一个通用的包罗万象。“事务中止”错误是如何显示的?当
javax.faces.PROJECT\u STAGE
设置为
Development
时,您只能在Mojarra中看到的JavaScript对话框中?服务器日志中是否也有堆栈跟踪?如果是,请将其包括在您的问题中。
public void create() {
        try {
            getFacade().create(current);
            recreateModel();
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("StandortCreated"));
        } catch (EJBException e) {
            JsfUtil.addErrorMessage(ResourceBundle.getBundle("/Bundle").getString("YourOwnFromBundle"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }